4

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

2 回答 2

4

您需要预先对其进行初始化,或者添加一个default子句:

switch (1) {
case 1:
    b = true;
default:
    b = false;
}

JVM 分析所有可能的情况是不可行的,即使是文字也不行。至少,正如@assylias 指出的那样,语言规范并不要求它应该这样做。

因此,从代码分析的角度来看,它必须以与处理变量相同的方式处理文字,并且它无法知道始终选择特定路径,即使在这里我们可以很容易地看到第一种情况会总是匹配。

b因此,无论值是什么,它都需要看到变量被初始化,因此需要一个default子句。

于 2013-05-05T20:39:26.747 回答
1

您可以参考JLS #16.2.9。特别是,如果没有default语句,编译器无法确定b在 switch 语句之后肯定分配,即使在您的示例中很明显它是。

于 2013-05-05T20:43:04.190 回答