据我所知,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中的错误?
答案 0 :(得分:35)
编译器正在进行常量折叠(预计算普通文字表达式)。这是表达“突然完成”的情况,使用JLS措辞,取消其满足“常量表达”的定义。所以这不是一个错误,它与JLS一致。
是的,表达式也没有计算值(警告用户尝试执行类似这样的操作,结果不是常量表达式),但编译器在尝试之前不知道。不评估价值并突然完成似乎是相辅相成的。
添加像
这样的变量声明int x = 1 / 0;
不会导致编译器错误,它是强制在编译时计算表达式的开关。
顺便说一下,我检查了Oracle和IBM JDK的版本7也发生了这种情况,它不是特定于OpenJDK或JDK8的。
答案 1 :(得分:15)
常量表达式必须能够计算为值,因为编译器必须将该表达式重新计算为值。
1/0
没有任何价值。
来自JSL§15.28:
编译时常量表达式是一个表达表示基本类型的值的表达式或一个不突然完成的字符串,仅使用以下内容组成: