1/0 是合法的 Java 表达式吗?
以下内容在我的 Eclipse 中编译得很好:
final int j = 1/0;
// compiles fine!!!
// throws ArithmeticException: / by zero at run-time
Java首先阻止了许多“哑代码”甚至编译(例如 没有编译!),所以这甚至没有产生那么多的警告,这让我感到非常惊讶。当您考虑到允许在编译时优化常量表达式这一事实时,这种吸引力会加深:"Five" instanceof Number
public class Div0 {
public static void main(String[] args) {
final int i = 2+3;
final int j = 1/0;
final int k = 9/2;
}
}
在 Eclipse 中编译后,上面的代码段生成以下字节码 (javap -c Div0
)
Compiled from "Div0.java"
public class Div0 extends java.lang.Object{
public Div0();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1 // "i = 5;"
2: iconst_1
3: iconst_0
4: idiv
5: istore_2 // "j = 1/0;"
6: iconst_4
7: istore_3 // "k = 4;"
8: return
}
如您所见,和 赋值被优化为编译时常量,但除法(必须在编译时可检测到)只是按原样编译。i
k
0
javac 1.6.0_17
表现得更奇怪,静默编译,但将分配完全从字节码中删除(可能是因为它确定它们不在任何地方使用),但保留完整的(因为删除它会导致完全不同的程序语义)。i
k
1/0
所以问题是:
- 实际上是一个合法的Java表达式,应该随时随地编译吗?
1/0
- JLS对此有何评论?
- 如果这是合法的,那么有充分的理由吗?
- 这可能有什么好处呢?