switch语句中的最终变量大小写
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
,一切正常。
b
可能尚未初始化,并且可以为其分配多个值。 在您的示例中,它显然已初始化,但可能编译器无法知道(并且它不能)。 想像:
final int b; if (something) { b = 1; } else { b = 2; }
编译器在switch
需要一个常量,但b
的值取决于某个外部变量。
switch语句中的case应该是编译时的常量。 命令
final int b=2
在编译时将值2
赋值给b
。 但是以下命令在运行时将值2
分配给b
。
final int b; b = 2;
因此,编译器抱怨,当它在switch
语句的一个案例中找不到常量时。
没有赋值的最终变量称为空变量。 空白最终版只能分配一次,并且必须在分配发生时或在程序中取消分配。
为了做到这一点,Java编译器运行流分析以确保对于空白最终变量的每个赋值,在赋值之前肯定未赋值变量; 否则会发生编译时错误
这就是为什么当编译器编译switch结构时,它会抛出所需的常量表达式,因为编译器不知道b的值。