2013-03-13 99 views
2

下面的代碼給了我一個錯誤,指向語句「return mon;」中的'm'。它說明「變量mon可能沒有被初始化」,當它在這個方法的開始非常清楚地初始化時。它必須是超級簡單的東西,我只是不明白!謝謝。爲什麼java說我沒有初始化變量?

public String monthName(int month) 
{ 
    String mon; 
    switch (month) 
    { 
     case 1: 
      mon = "January"; 
      break; 
     case 2: 
      mon = "February"; 
      break; 
     case 3: 
      mon = "March"; 
      break; 
     case 4: 
      mon = "April"; 
      break; 
     case 5: 
      mon = "May"; 
      break; 
     case 6: 
      mon = "June"; 
      break; 
     case 7: 
      mon = "July"; 
      break; 
     case 8: 
      mon = "August"; 
      break; 
     case 9: 
      mon = "September"; 
      break; 
     case 10: 
      mon = "October"; 
      break; 
     case 11: 
      mon = "November"; 
      break; 
     case 12: 
      mon = "December"; 
      break; 
    } 
    return mon; 
} 
+1

你需要一個'switch'的'default'部分(或者明確地初始化它)。 – Lion 2013-03-13 19:05:12

+1

你總是可以返回「一月」,「二月」等,並有一個默認情況下處理它。不需要像這樣的臨時變量。 – 2013-03-13 19:06:41

+0

「當它在這個方法的開始時被非常明確地初始化」......呃關心告訴我們在哪裏? – JamesB 2013-03-13 19:09:28

回答

12

誰是說month總是1到12之間的整數?編譯器當然不能保證它。

要麼將​​mon初始化爲空,要麼在switchdefault案例中設置行爲。 (另外,你可以只返回月份名稱,而不是直接在一個臨時變量設置它們)。

或者,一個簡單的解決方案可能是

String[] monthNames = {"January", "February", ..., "December"}; 
return monthNames[month - 1]; 
+0

默認!是的,我使用了temp變量,因爲我之前在語句塊中使用return語句時遇到了麻煩(現在我認爲這是因爲一個不同的原因),只是想確保它不是不知何故問題。感謝您花時間幫助 – Matt 2013-03-13 19:13:24

+0

downvoter是否在意解釋? – 2013-03-14 16:46:18

0

你應該有一個默認情況下爲mon變量賦值switch (month)。你也應該給它分配空值。

0

如果月份編號不正確,則返回null只有在調用者期望發生這種情況並準備檢查爲null時纔有用。

如果調用例程不打算檢查空返回,那麼應該在默認情況下拋出一個RuntimeException。這比允許代碼在一段時間之後失敗並且由於錯誤的月份名稱導致空指針異常好得多!

例如..

default: 
    throw new RuntimeException("Invalid month number "+ month); 

這也將停止編譯器抱怨,因爲沒有辦法去與週一return語句不會被初始化。