2016-02-18 157 views
-1

對於我的科學類我必須編寫一個程序來查找給定月份(1-12)中的天數,是否知道爲什麼我會收到錯誤「變量天可能沒有被初始化「當試圖從交換機返回int」天「?下面的代碼:因爲month作爲參數傳遞給函數提供變量可能未被初始化

public static int getNumberofDays(int month,int year) 
    { 
     // Imports the required Scanner 
     Scanner kbd = new Scanner(System.in); 

     final String month; 
     final int days; 
     switch (month) { 
     case 1: days = 31; 
      break; 
     case 2: if ((year % 4 == 0) && year % 100 != 0) 
        { 
        days = 29; 
        } 
        else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 
        { 
        days = 29; 
        } 
        else 
        { 
        days = 28; 
        } 
      break; 
     case 3: days = 31; 
      break; 
     case 4: days = 30; 
      break; 
     case 5: days = 30; 
      break; 
     case 6: days = 31; 
      break; 
     case 7: days = 31; 
      break; 
     case 8: days = 31; 
      break; 
     case 9: days = 30; 
      break; 
     case 10: days = 31; 
      break; 
     case 11: days = 30; 
      break; 
     case 12: days = 31; 
      break; 
     default: month = "invalid"; 
      break; 
     } 
     return days; 
    } 
+1

您發佈的代碼不準確。這引發了一個不同的編譯錯誤。 –

+0

多麼棘手的問題!一種方法犯了很多錯誤,非常酷! – radoh

回答

0
  1. final String month;是無效的。

  2. 您並未在所有控制路徑上初始化days:您的switch中的default塊不會執行此操作。這是Java的一個很好的功能,因爲它可以幫助您實現程序的穩定性。沒有什麼比編譯器更好告訴你該怎麼做。 不要強行通過書面編號final int days = 0;;而是在default塊中爲其分配一個值。

+0

我需要一杯咖啡嗎? – Bathsheba

+0

對我來說很好。 – Neil

+0

特別是現在我更仔細地閱讀了這個程序 – Bathsheba

6

爲什麼我收到錯誤 「變量天可能尚未初始化」

因爲:

final int days; 

應該是:

int days = 0; 

爲什麼?

  • 變量的方法應該初始化
  • 最終變量不能被修改。

其他錯誤:

  • 你不覆蓋month所有可能的值switch
  • 你定義一個String month,陰影參數int month
  • Scanner未使用
  • 更多... XD

用自己的方式

另外,如果你不破的情況下,塊下一個將被執行

我的解決方案,這意味着你可以這樣做:

public static int getNumberofDays(int month,int year) { 
    switch (month) { 
     case 1: 
     case 3: 
     case 6: 
     case 7: 
     case 8: 
     case 10: 
     case 12: 
      days = 31; 
      break; 
     case 4: 
     case 5: 
     case 9: 
     case 11: 
      days = 30; 
      break; 
     case 2: 
      if ((year % 4 == 0) && year % 100 != 0) 
      { 
      days = 29; 
      } 
      else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 
      { 
      days = 29; 
      } 
      else 
      { 
      days = 28; 
      } 
      break; 
     default: days = -1; 
      break; 
    } 
    return days; 
} 

我的解決方案:Calendar!:

public static int getNumberofDays(int month,int year) 
{ 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.MONTH, month); 
    cal.set(Calendar.YEAR, year); 
    return cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
} 

Neil溶液:Java-8

public static int getNumberofDays(int month,int year) 
{ 
    YearMonth yearMonthObject = YearMonth.of(year, month); 
    return yearMonthObject.lengthOfMonth(); 
} 
+1

你的重複任務很醜,意味着你不能再使用'final'。 – Bathsheba

+0

@尼爾同意,複製粘貼錯誤,修改! –

+0

@Bathsheba我不使用final,但同意重複聲明...我的錯誤和修復 –

-1

的問題是,所述days變量不具有開關的default子句中分配給它的任何值。 如果交換機屬於默認部分,那麼它將不會被初始化。

在聲明時初始化days或在默認開關塊中分配一個值。

否則,如果您的設計允許,請在默認子句中引發異常。

-2

添加days = 0;到默認情況下,因爲這樣的:

default: 
    month = "invalid"; 
    days = 0; 
     break; 

你必須給days值某處的代碼路徑,你試圖返回它之前。您還應該用int days;替換final int days;。 另外,你不能有final String month,因爲month作爲參數傳遞給函數..只是刪除month的重新聲明,你是黃金。

+0

它會解決它,但解釋爲什麼會很好。編輯:我回來,這隻會解決兩個問題之一。 – Neil

+0

咄。我需要我的早晨咖啡以及 – mike

+0

還好還好容易與downvotes ..哈哈番 – mike

1

並非所有可能的路徑都通過您的代碼爲days變量賦值。確切地說,默認塊沒有。

default: month = "invalid"; 
      break; 

如果將其更改爲

default: month = "invalid"; 
     days=0 
      break; 

,報警信號消失。

我的其他問題是:

  • 爲什麼你定義一個String一個月,從而遮蔽參數一個月?
  • 掃描儀的用途是什麼?
  • 爲什麼你在默認塊中將月份分配爲無效,你永遠不會返回它。