【问题标题】:A final constant not accepted in switch case在 switch case 中不接受最终常量
【发布时间】:2014-05-05 13:01:22
【问题描述】:

我想知道 add() 方法中的 2 个声明之间的区别,如下所示。

final int c;
c = 20;

和

final int c = 20;

我认为两者都是最终变量,我无法为其重新分配任何新值。这是对上述声明进行不同处理的方法。

void add() {
        final int a = 30;
        final int b = 10;
        final int c;
        c = 20;

        switch (a) {
        case b + c:
            System.out.println("In case b+c");
            break;

        default:
            break;
        }

    }

上面的方法根本编译不了,报错

常量表达式需要 case b+c

如果变量 c 在一行中被声明和初始化,比如final int c = 30;。有用。

【问题讨论】:

  • 看看这个en.m.wikipedia.org/wiki/Final_(Java),正如它在链接中所说的那样,当变量不会改变时使用final。你声明了变量但没有设置它的值......然后在下面你设置它的值......你不能那样做......
  • 两者是等价的(我认为),因为你可以分配 c 一次。如果你想在你的开关中保持逻辑,请执行“final int d = b+c;”和你的开关中的“case d:”。

标签: java switch-statement java-7 final


【解决方案1】:

JLS #4.12.4 将常量变量定义为(强调我的):

原始类型或String 类型的变量,即最终并使用编译时常量表达式初始化,称为常量变量。

在您的情况下,final int c = 20; 是一个常量变量,但 final int c; c = 20; 不是。

【讨论】:

    【解决方案2】:

    如果final 标识符在单个(相同)语句中声明和初始化,Java 编译器会将其替换为其值,否则标识符保持原样并在运行时由 jvm 为blank final 变量初始化。您可以通过打开 class 文件看到这一点。 switch 语句允许 final,但不允许将 blank 变量用作 case 值。

    final int a = 20; // concrete final variable
    switch(a){}
    #=> gets changed by compiler as the following:--
    switch(20){}
    
    final int a; // blank final variable
    a = 20;
    switch(a){}
    #=> compiler leave it for jvm to initialize 
    switch(a){}
    

    【讨论】:

      【解决方案3】:

      当您单独初始化和声明它时,您会收到该错误,同时执行它并且它可以工作

      【讨论】:

        【解决方案4】:

        final 变量不能在运行时再次重新计算,如果你想使用 switch case 你不能在 case 子句中像 (b+c) 那样做, 而不是这个,请使用这个,

        void add() {
            final int a = 30;
            final int b = 10;
            final int c;
            c = 20;
            final int cmp=b+c;
            switch (a) {
            case cmp:
                System.out.println("In case b+c");
                break;
            default:
                break;
            }
        }
        

        现在这对你来说很好用,

        【讨论】:

        • 编译错误:case expressions must be constant expressions。看看接受的答案,这里接受带有最终变量的表达式。不接受非最终变量。
        【解决方案5】:

        你必须在使用前初始化局部变量..

        【讨论】:

        • 使用前已初始化。问题是它没有在声明时初始化。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        • 2016-06-08
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2023-04-07
        相关资源
        最近更新 更多