3

静的初期化ブロックjava.lang.ExceptionInInitializerErrorでキャッチされた例外を再スローするために使用します。メッセージと原因の両方で構築することはできないことに気付きました。どちらか一方だけです。

  1. 正当な理由はありますか?
  2. チェックされた例外を静的な初期化ブロックからチェックされていない例外として再スローするために、どのような代替案を提案できますか? 例:java.lang.RuntimeExceptionメッセージと原因の両方を許可するものとして再スローします。

更新: #2 を明確にし、サンプル コードを追加しました。

public class Sample {

    private static final String _FILE_PATH = "blah/blah/blah";

    static {
        try {
            FileReader in = new FileReader(new File(_FILE_PATH));
        }
        catch (FileNotFoundException e) {
            // Option A: Without context message
            throw new ExceptionInInitializerError(e);
            // Option B: With context message
            String msg = String.format("Failed to open file for reading: '%s'", _FILE_PATH);
            throw new RuntimeException(msg, e);
        }
    }
}

Ref: Java が静的初期化ブロックからチェック例外をスローできないのはなぜですか?

4

3 に答える 3

1

hereに記載されているように、おそらく代わりに使用する必要があるコンストラクターExceptionInInitializerError(Throwable thrown)があります。これは、標準の例外チェーンに準拠しており、スタック トレースを保持し、他の有用な機能を実行します (サンプルのチェーン例外出力を参照してください)。

編集

リンク先の質問に対するこの回答に記載されているように、チェックされた例外がstaticブロックから外れることを許可することは禁止されています。Class.forNameチェックされていない例外は問題ありませんが、 (非常にまれです)を使用して手動で動的クラスロードを行っていない限り、どこにもキャッチできません。

これは、「静的イニシャライザでスローしたものをすべてキャッチしてください」という意味です。基本的に、作成してスローする例外が何であれ、あまり役に立ちません。

于 2013-05-07T02:45:15.247 に答える