“1/0”在Java中是一个常量表达式吗?

2022-09-01 08:49:54

据我所知,Java 8 JLS的表达式被认为是一个常量表达式,但是当我尝试使用OpenJDK 8编译以下程序时,我得到一个错误(1/0)

public class Switch {
    public static void main(String[] args) {
        switch(42) {
            case (1/0):
                return;
            default:
                return;
        }
    }
}

错误说不是常量表达式(1/0)

Switch.java:4: error: constant expression required
            case (1/0):
                 ^
1 error

我错过了什么吗?还是OpenJDK 8中的一个错误?


答案 1

编译器正在执行常量折叠(预计算琐碎的文字表达式)。在这种情况下,表达式“突然完成”,使用JLS措辞,使其不符合“常量表达式”的定义。所以这不是一个错误,它与JLS一致。

是的,表达式的计算结果也不会达到值(警告尝试执行类似操作的用户,结果不会是常量表达式),但编译器在尝试之前不知道。不评估价值和突然完成似乎是齐头并进的。

添加变量声明,如

int x = 1 / 0;

不会导致编译器错误,而是开关强制在编译时计算表达式。

顺便说一句,我检查了Oracle和IBM JDK的版本7也发生了这种情况,它不是OpenJDK或JDK8特定的。


答案 2

常量表达式必须能够计算为值,因为编译器必须将该表达式重新定义为值。

1/0没有任何价值。

来自 JSL §15.28:

编译时常量表达式是表示基元类型或 String 的表达式,它不会突然完成,并且仅使用以下内容组成:


推荐