查询Java-初始化错误

时间:2016-01-16 11:47:56

标签: java

public class Switch {
    public static void main(String args[]){
        int month=4; 
        String season="";   // QUESTION: giving ERROR if not initializing here, y ?
        switch(month){
            case 12:
            case 1:
            case 2:
                season="Winter";
                break;
            case 3:
            case 4:
            case 5:
                season="Spring";
                break;
            case 6:
            case 7:
            case 8:
                season="Summer";
                break;
            case 9:
            case 10:
            case 11:
                season="Autumn";
                break;
            default:
              System.out.println("Bogus Month");

        }
        System.out.println("April is in the "+season+".");
       }
}

我使用If else创建了这个示例代码,并且它在变量季节没有显示初始化错误,但是在这里它显示了初始化错误。哪里错了?

这是使用If else的相同代码,但是这里的季节没有初始化,但没有给出任何错误。

public class IfElse {
    public static void main(String args[]){
        int month=4; 
        String season;

        if(month==12 || month==1 ||  month==2)
            season="Winter";
        else if(month==3 || month==4 || month==5)
            season="Spring";
        else if(month==6 || month==7 || month==8)
            season="Summers";
        else if(month==9 || month==10 || month==11)
            season="Autumn";
        else 
            season="Bogus Month";
        System.out.println("April is in the "+season+".");
    }
}    

3 个答案:

答案 0 :(得分:2)

区别在于switchdefault case没有为season设置任何内容。尝试在default中设置一些值,不要初始化变量。它不会给你一个错误。

类似的东西:

default:
   season = "default";
   System.out.println("Bogus Month");

这是因为编译器知道在打印season值之前它会在执行switch之后设置一些值,因为default将值设置为season 。与您的if-else一样,确保season在执行后会有一个值。

答案 1 :(得分:1)

  

局部变量未获取默认值,其初始值未定义   所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值初始化它们。在局部变量的情况下,它们不会被加载到堆中,它们被存储在堆栈中,直到它们在java 7之前被使用,因此我们需要显式初始化它们。

在您的第二个示例中,当您使用if-else语句时,本地变量season不需要初始化,因为您在块if-ifelse-else下方的块{<1}}结尾了:

             else 
            season="Bogus Month";

但是如果您删除此else声明,则需要对其进行初始化 这意味着变量season将在每种情况下都会收到一个值,而switch-case语句不确定会收到一个值,除非您将默认值放在switch-case语句的末尾这样:

        default:
          System.out.println("Bogus Month");
           season="some value";
            break;

答案 2 :(得分:0)

错误是,您需要在所有情况下初始化或设置变量“season”的值。如果您没有在任何情况下为“季节”分配值,例如在case 6中,则不打印任何内容(未初始化/未分配任何值的变量)。删除“IfElse”中的语句即删除语句season = "Autumn";时会发生同样的错误。