final int a = 1;
final int b;
b = 2;
final int x = 0;
switch (x) {
case a:break; // ok
case b:break; // compiler error: Constant expression required
}
/* COMPILER RESULT:
constant expression required
case b:break;
^
1 error
*/
为什么我会遇到这种错误?如果我完成final int b = 2
,一切正常。
答案 0 :(得分:15)
switch语句中的case应该是编译时的常量。命令
final int b=2
在编译时将2
的值分配给b
。但是以下命令会在运行时中将2
的值分配给b
。
final int b;
b = 2;
因此,当编译器在switch
语句的一个案例中找不到常量时,编译器会抱怨。
答案 1 :(得分:10)
b
可能尚未初始化,因此可以为其分配多个值。在您的示例中,它显然已初始化,但可能编译器无法知道(并且它不能)。想象:
final int b;
if (something) {
b = 1;
} else {
b = 2;
}
编译器需要switch
中的常量,但b
的值取决于某些外部变量。
答案 2 :(得分:3)
没有赋值的最终变量称为空变量。空白最终版只能分配一次,并且必须在分配发生时或程序中取消分配。
为了做到这一点,Java编译器运行流分析,以确保对于空白最终变量的每次赋值,变量在赋值之前肯定是未赋值的;否则发生编译时错误
这就是为什么当编译器编译switch结构时,它会抛出所需的常量表达式,因为编译器不知道b的值。