Java での ExceptionInInitializer エラー
この記事では、Java の ExceptionInInitializerError
について学習します。
Java での ExceptionInInitializerError
の簡単な紹介
ExceptionInInitializerError
は Java の非チェック例外で、Error
クラスの子です。 これは、ランタイム例外のカテゴリに分類されます。
Java では、JVM (Java 仮想マシン) が静的初期化ブロックの評価、インスタンス化、または静的変数への値の割り当てに失敗すると、例外 ExceptionInInitializerError
が発生します。 これは、静的初期化子で問題が発生したことを示しています。
この例外が静的初期化子内で発生するたびに、Java は、例外を ExceptionInInitializerError
クラスのオブジェクト内にラップすることによって、根本原因として実際の例外への参照を維持します。
Java での ExceptionInInitializerError
の例
上記の議論に基づくと、ExceptionInInitializerError
は主要なケースで発生します。 それをよりよく理解するために、いくつかの例を見てみましょう。
例 1: 静的変数に値を割り当てるシナリオ。
public class Test {
static int x = 100 / 0;
public static void main(String[] args) {
System.out.println("Value of x is " + x);
}
}
出力:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ArithmeticException: / by zero
at Test.<clinit>(Test.java:4)
上記のコードでは、100/0
値を静的変数 x
に代入しましたが、これは未定義の算術動作をもたらします。そのため、静的変数に値を代入する際に例外が発生し、最終的に ExceptionInInitializerError
が発生します。
出力では、実際の例外 ArithmeticException
が ExceptionInInitializerError
クラスのインスタンス内にラップされていることも確認できます。
例 2: 静的ブロック内で null 値が割り当てられるシナリオ。
public class Test {
static {
String str = null;
System.out.println(str.length());
}
public static void main(String[] args) {}
}
出力:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
at Test.<clinit>(Test.java:7)
上記のコードでは、値 null
を持つ文字列 str
を持つ静的ブロックを作成しました。 そのため、length()
メソッドを使用してその長さを取得しようとすると、null
を値として文字列の長さを出力するため、NullPointerException
が発生します。
ただし、この例外は静的ブロック内で発生するため、ExceptionInInitializerError
クラス内にラップされ、出力に ExceptionInInitializerError
が含まれます。
Java で ExceptionInInitializerError
を処理する
Java の ExceptionInInitializerError は、次の点を確保することで回避できます。
- プログラムで静的変数を初期化しても実行時例外がスローされないことを確認します。
- プログラム内の静的初期化ブロックが実行時例外をスローしないようにします。
まとめ
この記事では、静的変数の初期化中または静的ブロックの評価中にいくつかの例外が発生したことを示す、Java の ExceptionInInitializerError
について学びました。 このエラーは、基礎となる例外のランタイム ラッパーとして機能し、プログラマーが基礎となる例外を解決するまで JVM を停止します。