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+".");
}
}
答案 0 :(得分:2)
区别在于switch
,default 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";
时会发生同样的错误。