看看这个简单的 Java 代码:
final class A {
public static void main(String[] args) {
int x = 3;
boolean b;
switch(x) {
case 1:
b = true;
break;
default:
throw new RuntimeException();
}
System.out.println("b: " + b);
}
}
它在开关中分配一个b
值,但在默认情况下,会引发异常。当然,在实际代码中,x
会以更复杂的方式计算。
$ javac A.java && java A
Exception in thread "main" java.lang.RuntimeException
at A.main(A.java:10)
按预期运行时失败。
有人想将这个异常抛出到一个函数中,以避免一遍又一遍地输入相同的东西:
final class A {
private static final void f() {
throw new RuntimeException();
}
public static void main(String[] args) {
int x = 3;
boolean b;
switch(x) {
case 1:
b = true;
break;
default:
f();
}
System.out.println("b: " + b);
}
}
但是,这不起作用:
$ javac A.java && java A
A.java:15: variable b might not have been initialized
System.out.println("b: " + b);
^
1 error
它抱怨b
可能没有初始化,尽管它显然与前面的代码等效。为什么?