`1/0` 是 Java 中的常量表达式吗?

Is `1/0` a constant expression in Java?

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

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 中的错误?

编译器正在进行常量折叠(预计算平凡的文字表达式)。在这种情况下,表达式 "completes abruptly" 使用 JLS 措辞,使其不符合 "constant expression" 的定义。所以不是bug,和JLS一致。

是的,表达式也不会求值(警告用户尝试做这样的事情,结果将不是常量表达式),但编译器直到它尝试才知道.不评估值和突然完成似乎是齐头并进的。

添加变量声明如

int x = 1 / 0;

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

顺便说一下,我检查过 Oracle 和 IBM JDK 的第 7 版也会发生这种情况,这不是特定于 OpenJDK 或 JDK8 的。

常量表达式必须能够计算出一个值,因为编译器必须将该表达式重新转换为一个值。

1/0 没有任何值。

来自 JSL §15.28:

A compile-time constant expression is an expression denoting a value of primitive type or a String that does not complete abruptly and is composed using only the following: