变量是在交换机的所有情况下分配的,但Java说它可能不是?

时间:2013-05-05 20:37:13

标签: java compilation variable-assignment

为什么这个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

2 个答案:

答案 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,即使在您的示例中显而易见它也是如此。