【发布时间】:2011-06-26 04:57:24
【问题描述】:
为什么这段代码会编译?
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,但由于它是除以零,它就让它通过。没有编译时错误。但这似乎非常非常奇怪......编译器知道它是除以零并且它会导致运行时崩溃,但它不会标记编译错误!
谁能给我解释一下为什么?
【问题讨论】:
-
是否有任何除以零的实例会产生编译时错误?如果你在正常的程序代码中除以零,你会在运行时得到一个
ArithmeticException,所以我认为这通过编译器也没什么奇怪的。
标签: java constants compile-time-constant jls constant-expression