Java での ExceptionInInitializer エラー

Suraj P 2023年10月12日
  1. Java での ExceptionInInitializerError の簡単な紹介
  2. Java で ExceptionInInitializerError を処理する
  3. まとめ
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 が発生します。

出力では、実際の例外 ArithmeticExceptionExceptionInInitializerError クラスのインスタンス内にラップされていることも確認できます。

例 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 は、次の点を確保することで回避できます。

  1. プログラムで静的変数を初期化しても実行時例外がスローされないことを確認します。
  2. プログラム内の静的初期化ブロックが実行時例外をスローしないようにします。

まとめ

この記事では、静的変数の初期化中または静的ブロックの評価中にいくつかの例外が発生したことを示す、Java の ExceptionInInitializerError について学びました。 このエラーは、基礎となる例外のランタイム ラッパーとして機能し、プログラマーが基礎となる例外を解決するまで JVM を停止します。

著者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

関連記事 - Java Error