为什么这个Java代码不能编译?
class A {
public static void main(String[] args) {
boolean b;
switch(1) {
case 1:
b = true;
}
System.out.println("b: " + b);
}
}
它抱怨b
可能尚未初始化,即使在所有情况下都是我所知道的。如何b
不能初始化?
$ javac A.java
A.java:8: variable b might not have been initialized
System.out.println("b: " + b);
^
1 error
答案 0 :(得分:4)
您需要事先初始化它,或者添加default
子句:
switch (1) {
case 1:
b = true;
default:
b = false;
}
JVM分析所有可能的情况是不可行的,甚至对于文字也是如此。至少,正如@assylias指出的那样,语言规范并没有要求它应该。
因此,从代码分析的角度来看,它必须以与处理变量相同的方式处理文字,并且它无法知道始终选择特定路径,即使在我们很容易看出第一个案例总是匹配。
因此,无论值是什么,它都需要看到变量b
被初始化,因此需要default
子句。
答案 1 :(得分:1)
您可以参考JLS #16.2.9。特别是,如果没有default
语句,编译器就无法确定在switch语句之后是否明确赋值b
,即使在您的示例中显而易见它也是如此。