switch语句中的最终变量大小写

时间:2013-04-27 17:59:20

标签: java switch-statement case final

        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,一切正常。

3 个答案:

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