可能重复:
1/0 是合法的 Java 表达式吗?
为什么这段代码会编译?
class Compiles {
public final static int A = 7/0;
public final static int B = 10*3;
public static void main(String[] args) {}
}
如果我查看编译的类文件,我可以看到 B 已被评估为 30,而 A 仍然是 7/0。
据我了解JSL,除以零的表达式不是常数。
参考:JLS 15.28
我的上述陈述是由于这一行:
编译时常量表达式是表示原始类型值的表达式
因此除以零不会被评估为原始值。
我真正不明白的是为什么编译器仍然允许这样做?为了清楚起见,我上面的代码使用“java.lang.ExceptionInInitializerError”使运行时崩溃
在我看来,编译器威胁任何最终的静态变量作为常量并评估它的编译时间。这意味着编译器已经尝试评估 A,但由于它是除以零,它就让它通过。没有编译时错误。但这看起来非常非常奇怪......编译器知道它是除以零并且它会在运行时崩溃,但它不会标记编译错误!
谁能向我解释为什么?