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

Rey*_*les 33 java openjdk compiler-errors jls java-8

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

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

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

Switch.java:4: error: constant expression required
            case (1/0):
                 ^
1 error
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?或者它是OpenJDK 8中的错误?

Nat*_*hes 35

编译器正在进行常量折叠(预先计算普通文字表达式).这是表达"突然完成"的情况,使用JLS措辞,取消其满足"常量表达"的定义.所以它不是一个bug,它与JLS一致.

是的,表达式也没有计算值(警告用户尝试执行类似这样的操作,结果不是常量表达式),但编译器在尝试之前不知道.不评估价值并突然完成似乎是相辅相成的.

添加变量声明,如

int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,+1正确地强调了JLS规范的"突然完成"部分. (7认同)

Jac*_*ack 15

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

1/0 没有任何价值.

来自JSL§15.28:

编译时常量表达式是表示基本类型的值的表达式或不突然完成的字符串,仅使用以下内容组成:

  • 我认为重点应该是"不会突然完成",即抛出一个`java.lang.ArithmeticException`!好抓,谢谢! (6认同)
  • 无论数学如何,1.0/0.0都有Java值. (3认同)