在switch语句最后一个变量的情况下(final variable case in switch

2019-09-01 06:57发布

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

Answer 1:

b可能没有被初始化,所以可以被分配多个值。 在您的例子很明显是初始化,但可能是编译器不会去知道(它不能)。 想像:

final int b;
if (something) {
   b = 1;
} else {
   b = 2;
}

编译器需要在一恒定switch ,但的值b取决于一些外部变量。



Answer 2:

在switch语句的情况下,应该是在编译时间常数。 命令

final int b=2

的值赋给2b ,就在编译时。 但下面的命令指定的值2b运行系统

final int b;
b = 2;

因此,编译器会抱怨,当它不能在该案例之一找到一个恒定的switch语句。



Answer 3:

没有分配给它的价值最终的变量称为空白变量。 一个空白的最终只能被分配一次,并且当分配在程序中出现一次或必须是未分配的。

为了做到这一点,一个Java编译器运行的流量分析,以确保为每一个分配到空白最终变量,该变量赋值之前肯定未分配; 否则将发生编译时间错误

这就是为什么当编译器编译的开关构造它是扔需要常量表达式因为b的值是未知的编译器。



文章来源: final variable case in switch statement