重複の可能性:
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 を評価しようとしたことを意味しますが、それはゼロによる除算であるため、そのまま通過させました。コンパイル時エラーなし。しかし、これは非常に奇妙に思えます...コンパイラは、それがゼロ除算であり、ランタイムがクラッシュすることを認識していますが、それでもコンパイルエラーにフラグを立てません!
誰かが私に理由を説明できますか?