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的值。