4

コンテキスト: java.io.File クラスには、次のような static 内部クラス メソッドがあります。

    LazyInitialization.temporaryDirectory();

[いくつかのコードを追加するために編集] 以下の私のコードは、最終的に上記のコード行を呼び出します。temporaryDirectory() メソッド内から例外がスローされますが、これは私のコンテキストでは問題ありません/予想されます。

try {
    File tempFile = File.createTempFile("aaa", "aaa");
} catch (Exception e) {
    // handle exception 
}

次に、同じメソッド (createTempFile) を再度呼び出すと、「java.lang.NoClassDefFound エラー - クラス java.io.File$LazyInitialization を初期化できませんでした」というメッセージが表示されます。

質問: 内部メソッドが例外をスローしたとしても、内部クラス LazyInitialization は、その静的メソッドが呼び出されたときにクラス ローダーによってロードされているはずだと思いました。しかし、2 回目の呼び出し時に NoClassDefFound エラーが表示されるのはなぜですか? 元の仮定は間違っていますか?

4

1 に答える 1

7

静的初期化コードがランタイム例外をスローすると、例外は ExceptionInInitializerError によってラップされ、クラスのロードをトリガーするコードのコンテキストでスローされます (エラー例外の場合はラップされません)。この時点で、クラスの読み込みに失敗しました。したがって、後で使用しようとすると、NoClassDefFoundError が発生します。

おそらくこれはあなたが経験していることです。

于 2010-12-13T22:18:42.103 に答える