2015-03-02 61 views
0

我正在學習java,遇到一個變量在使用開關塊時可能未被初始化錯誤。變量在使用開關塊時可能未被初始化?

這是我的代碼;

class Switch 
{ 
     public static void main (String [] args) 
     { 
       int month = 2; 
       String monthString; 
       switch (month) 

         { 
         case 1: monthString = "January"; 
           break; 
         case 2: monthString = "February"; 
           break; 
         case 3: monthString = "March"; 
           break; 

         } 
       System.out.println (monthString); 

     } 

} 

錯誤;

Switch.java:17: error: variable monthString might not have been initialized 
     System.out.println (monthString); 

現在據我所知,當您試圖訪問你還沒有初始化的變量,但我不能初始化,當我給它分配在開關塊值出現此錯誤?

謝謝。

+0

如果'month'變量是4或-1?你應該在交換機上添加'default:'部分來處理所有其他情況(當'month <1'或'month> 3'時)。 – 2015-03-02 22:31:42

回答

4

如果month12,或3,再有就是它的引用之前初始化monthString的執行路徑沒有聲明。編譯器將不會假定month變量保留其值2,即使monthfinal

JLS, Chapter 16,談到「明確的分配」和變量可能被「明確分配」的條件,在它被引用之前。

除了條件布爾運算符& &的特殊處理,||和? :和布爾值常量表達式中,表達式的值在流程分析中未被考慮。

變量monthString在引用之前沒有明確分配。

switch塊之前初始化它。

String monthString = "unrecognized month"; 

或者它在default情況下,在switch聲明初始化。

default: 
    monthString = "unrecognized month"; 
+0

嗯謝謝你,我正在閱讀的這本書似乎在解釋中留下了這一點?所以我不知道這是必要的,謝謝。 – 2015-03-02 22:33:19

0

這並不直接回答你(回答)的問題,但它提供了一種替代的方法來組織一些設定,你事先知道值,讓你更輕鬆地在它們之間切換。

只要您有一個可以在編譯時明確指定的常量列表,就可以考慮使用enum類型。您可以循環或打開枚舉類型,而不必擔心特殊或無效的情況,如int month = -1String monthString = "Monday"

枚舉有被類型安全的好處,並允許您將任何類型的信息或行爲將其連接,就像你會怎麼字段或方法添加到一個類:

public enum Month 
{ 
    JANUARY(31), 
    FEBRUARY(27), 
    MARCH(31); 

    // To attach information to a enum type, 
    // Create an instance field and pass the data through the constructor. 
    private int days; 
    Month (int days) 
    { 
     this.days = days; 
    } 
    public int numberOfDays() 
    { 
     return this.days; 
    } 
} 

現在一個switch語句,您可以確定該值必須屬於我們剛纔描述的集合:

Month month = Month.JANUARY; 
switch (month) 
{ 
    case JANUARY: 
     System.out.println("New year, new life"); 
     break; 
    case FEBRUARY: 
     System.out.println("You wouldn't want to miss a single day!"); 
     break; 
    default: 
     System.out.println("What month is it again?"); 
} 
System.out.println(month.numberOfDays); // prints 31