2015-12-02 83 views
3

這裏我試圖通過輸入月份數來獲得輸出月份,但爲什麼我有錯誤 - 「月份字符串」可能沒有被初始化? - 爲什麼我沒有從「monthString」獲取輸出字符串?爲什麼變量必須被初始化?

爲什麼monthString必須被初始化?

import java.util.Scanner; 
public class SwitchClass { 

public static void main(String[]args) 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.printf(" when did u born ? "); 
    int monthNumber = input.nextInt(); 
    String monthString ; 

switch (monthNumber) 
{ 
    case 1: 
    monthString = "January "; 
     break; 
    case 2: 
     monthString = "February "; 
     break; 
    case 3: 
     monthString = "March "; 
     break; 
    case 4: 
     monthString = "April "; 
     break; 
    case 5: 
     monthString = "May"; 
     break; 
    case 6: 
     monthString = "June"; 
     break; 
    case 7: 
     monthString = "July"; 
     break; 
    case 8: 
     monthString = "August"; 
     break; 
    case 9: 
     monthString = "September"; 
     break; 
    case 10: 
     monthString = "October"; 
     break; 
    case 11: 
     monthString = "November"; 
     break; 
    case 12: 
     monthString = "December"; 
     break; 
    } 
System.out.println(monthString);  } 

} 

回答

8

如果monthNumber不在1和12之間怎麼辦?在這種情況下,monthString將不會被初始化。

String monthString = null; // or "" 
+4

或者創建一個默認開關的情況下,它給它一個值。 –

+0

有道理,明白了。謝謝 – tun

5

這將是一個默認的情況下添加到您的switch語句是一個好主意:當你把它聲明你應該給它一些默認值。

例子:

switch (monthNumber) { 
    case 1: monthString = "January"; 
     break; 

    //other cases... 

    default: monthString = "Invalid Month Number"; 
     break; 
} 

這樣,如果monthNumber不是那麼1-12仍存在一個默認的情況下switch語句流向。

-3

局部變量必須始終在使用前初始化。 對於Java 6,編譯器不考慮流控制塊和try-catch塊內的變量的初始化「012不完整」「」。初始化必須對所有案件進行:

如果 - 否則

String s; 
int a = 10; 
if(a > 5){ 
s = "5"; 
}else{ 
System.out.println(""); 
}  
System.out.println(s); // error if s isn't initialized within both if and else blocks 

While循環

String s; 
int a = 10; 
while(a > 0) { 
    s= ">0"; 
    a--; 
}  
System.out.println(s);// error if s isn't initialized outside the while 

try-catch塊

String s; 
try { 
s = ""; 
    } catch (Exception e) {} 
System.out.println(s);// error if s isn't initialized within both try and catch blocks 

開關塊

String s; 
int a = 10; 
switch (a) { 
    case 10: 
     s="10"; 
     break; 
    default: 
     break; 
     } 
System.out.println(s);// error if s isn't initialized all cases, default case included 

開關之前初始化變量和所有將被罰款。

String monthString = ""; 
+2

這兩個帳戶都不正確。 –

+0

@ScottM。我認爲在改進我的帖子後,我的想法已經很清楚了。 –

0

monthString是main()中的局部變量,因此,它必須被初始化以防止編譯器錯誤。

如果monthString是一個類變量,那麼它不必顯式初始化。

您可以通過移動的主(monthString外做到這一點),並聲明爲:

靜態字符串monthString;

1

可能是此鏈接將有助於得到正確的理解。

http://stackoverflow.com/questions/5478996/should-java-string-method-local-variables-be-initialized-to-null-or 
0

因爲Java語言的設計者認爲它更有意義!初始化變量時代碼更容易閱讀。String foo;聲明感覺不確定,因爲您必須猜測String的默認值是多少,而String foo = null;更具確定性。

爲了給你一個更明顯的例子,考慮一下:

int x; 
Int y; 

你能很快猜出的默認值?您可能需要暫停幾秒鐘以實現x可能爲0,而y可能爲空

相關問題