javac がこの定数式をどのように計算するのだろうか?
class Test {
public static final int NaN = 0 / 0;
...
Java 言語仕様、§15.17.2で定義されています。
この規則を満たさない特殊なケースが 1 つあります。被除数がその型で可能な最大の大きさの負の整数で、除数が -1 の場合、整数オーバーフローが発生し、結果は被除数と等しくなります。この場合、オーバーフローがあっても例外はスローされません。一方、整数除算の除数の値が 0 の場合は、an
ArithmeticException
がスローされます。
つまり、被除数が 0 の場合、除数が何であっても問題ありません。あっさり投げますArithmeticException
。
ここで、doublesを使用していた場合、 JLS §15.17.2NaN
によって返されます。
Java の整数プリミティブ型には、'NaN' または 'Inf' 値の表現がありません。(または、他のほとんどの言語で。)
実際に何が起こるかというと、ArithmeticException
実行時に an がスローされます。
この式はクラスの静的初期化で評価されるため、初期化クラスは失敗し、それに依存する他のクラスも初期化に失敗します。アプリケーションがメソッドの最初のステートメントにさえ到達しない可能性が十分にありますmain
。