Possible Duplicate:
Is 1/0 a legal Java expression?
Why does this code compile?
class Compiles {
public final static int A = 7/0;
public final static int B = 10*3;
public static void main(String[] args) {}
}
If I take a look in the compiled class file, I can see that B has been evaluated to 30, and that A still is 7/0.
As far as I understand the JSL an expression where you divide by zero is not a constant.
Ref: JLS 15.28
My above statement is due to this line:
A compile-time constant expression is an expression denoting a value of primitive type
Hence dividing by zero is not evaluated to a primitive value.
What I really dont understand is why the compiler allows this anyway? Just to be clear, my code above crashes runtime with a "java.lang.ExceptionInInitializerError"
As it seems to me the compiler threats any final static variable as a constant and evaluates it compile time. That means that the compiler already has tried to evaluate A, but since it was a division by zero it just let it go through. No compile time error. But this seems very very bizarre... The compiler knows it is a divide by zero and that it will crash runtime but nevertheless it doesn't flag a compile error!
Can anyone explain to me why?
To throw an
java.lang.ExceptionInInitializerError
is the only correct behavior.If your code did not compile, a perfectly valid Java program would have been rejected, and that would have been a bug.
The only correct alternative to putting
7/0
in the compiled code, would actually be to explicitly throw aExceptionInInitializerError
, but how much more useful is that?Actually, I wouldn't agree with that... would this program crash?