开关语句中的最终变量情况

2022-09-02 12:47:26
        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


答案 1

switch 语句中的大小写在编译时应为常量。命令

final int b=2

在编译时将 值赋给 。。但以下命令在运行时将 的值赋给 。2b2b

final int b;
b = 2;

因此,编译器会在语句的某个情况下找不到常量时进行报告。switch


答案 2

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

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

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