Dam*_*son 3 java variables switch-statement
使用switch block时遇到"变量可能未初始化"错误.
这是我的代码:
public static void foo(int month)
{
String monthString;
switch (month)
{
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
}
System.out.println(monthString);
}
Run Code Online (Sandbox Code Playgroud)
错误:
Switch.java:17: error: variable monthString might not have been initialized
System.out.println (monthString);
Run Code Online (Sandbox Code Playgroud)
据我所知,当您尝试访问尚未初始化的变量时会发生此错误,但是当我在交换机块中为其分配值时,我是否正在初始化它?
同样,即使月份是编译时常量,我仍然会收到相同的错误:
public static void foo()
{
int month = 2;
String monthString;
switch (month)
{
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
}
System.out.println(monthString);
}
Run Code Online (Sandbox Code Playgroud)
如果month不是1,2则执行路径中没有语句在monthString引用之前初始化.编译器不会假设month变量保留其2值,即使month是final.
在JLS,第16章,关于"明确赋值"的谈判,并在其下一个变量可以是条件,它引用之前"明确赋值".
除了条件布尔运算符&&,||和?的特殊处理之外 :和布尔值常量表达式一样,在流分析中不考虑表达式的值.
monthString在引用之前,该变量未明确赋值.
在switch块之前初始化它.
String monthString = "unrecognized month";
Run Code Online (Sandbox Code Playgroud)
或者default在switch语句中的情况下初始化它.
default:
monthString = "unrecognized month";
Run Code Online (Sandbox Code Playgroud)
或抛出异常
default:
throw new RuntimeExpception("unrecognized month " + month);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2991 次 |
| 最近记录: |