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

4

3 回答 3

15

switch 语句中的 case 在编译时应该是常量。命令

final int b=2

在编译时分配2to的值。b但是以下命令在Runtime2分配to的值。b

final int b;
b = 2;

switch因此,编译器会抱怨,当它在语句的一种情况下找不到常量时。

于 2013-04-27T18:24:10.573 回答
11

b可能尚未初始化,并且可以分配多个值。在您的示例中,它显然已初始化,但编译器可能不知道(而且它不能)。想象:

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

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

于 2013-04-27T18:08:04.200 回答
3

没有赋值的最终变量称为空白变量。空白期末考试只能分配一次,并且必须在分配发生时或在程序中取消分配一次。

为了做到这一点,Java 编译器运行流分析,以确保每次赋值给一个空白的 final 变量时,该变量在赋值之前肯定是未赋值的;否则会发生编译时错误

这就是为什么当编译器编译 switch 结构时,它会抛出所需的常量表达式,因为编译器不知道 b 的值。

于 2013-04-27T18:20:27.197 回答