我正在学习Java,并且正在根据一些书籍示例,通过简单的程序来查找一个月的季节。这两个类演示了两种测试值的方法:if / else if语句和switch语句。我感到困惑的是用于保存季节的字符串。当我将其声明为String season;
时,它将与if语句一起使用。但是使用switch语句,这样做会产生“本地变量季节可能尚未初始化”错误。
public class IfElse {
public static void main(String args[]) {
int month = 5;
String season;
// isn't initialized, works fine
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 = "Summer";
else
season = "Fall";
// this is okay
System.out.println("May is a " + season + " month.");
}
}
在声明的同时,不要在初始化上面的代码的同时初始化season,但是如果以相同的方式声明,则在最后一个println()
的switch的season变量会产生错误。
以下代码不起作用:
public class Switch {
public static void main(String args[]) {
int month = 5;
String season;
// HAS to be initialized, currently causes error
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 = "Fall";
break;
default:
System.out.println("Invalid month");
break;
}
System.out.println("May is a " + season + " month");
} // produces an error if season isn't initialized to null or ""
}
是什么原因造成的?是括住switch语句的花括号,还是switch语句本身存在问题?在if语句中初始化字符串与在switch语句中初始化字符串有何不同?我似乎无法理解这一点。
很抱歉,如果这非常明显,或者它似乎是一个愚蠢的问题。
答案 0 :(得分:45)
那是因为您没有指定默认情况下必须选择的季节。如果月份不在1到12之间,会发生什么? season
将不会初始化。
如果您只希望输入1到12,那么您可能需要考虑在Exception
中投掷default:
default:
throw new IllegalArgumentException("Invalid month");
答案 1 :(得分:9)
在您的第一个示例中,没有代码无法为“季节”分配值的路径。在第二个示例中,默认情况下未分配值,因此可以使用未初始化的值执行最后一次打印(“可能是...”)。
答案 2 :(得分:6)
在您的if
/ else
代码中,可以确保变量season
将获得一个值。也就是说,else
语句。
您的switch
代码没有它。看看如果给定的月份值为season
,变量13
会发生什么-它不会得到值,并且将保持未初始化状态。
答案 3 :(得分:4)
您应该使用此
public class Switch {
public static void main(String args[]) {
int month = 5;
String season;
// HAS to be initialized, currently causes error
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 = "Fall";
break;
default:
season = "Invalid";
break;
}
System.out.println("May is a " + season + " month");
} // produces an error if season isn't initialized to null or ""
}