[Java] SingletonなクラスでExceptionInInitializerError

Databaseから正常に応答が返ってくるかを定期的にチェックし、結果をRedisの特定キーに保持するプログラムを書いたんだが、Databaseが停止しているとConnectionを取得する際に ExceptionInInitializerError が出てしまう。catch (Exception e) としていても捕まえられなかったので、ちょっと調べた。

そもそも ExceptionInInitializerError って?

ExceptionInInitializerErrorとは : JavaA2Z

static初期化子内で例外が投げられた場合に投げられる。Errorクラスのサブクラスのため厳密には例外ではない。

なるほど。
今回、Connection取得処理をSingletonなクラスに集約したんだけど、そのSingletonクラスの初期化時に当該エラーが出ている模様。
Exceptionでcatchできなかったのは Errorクラスのサブクラス だからか。

今回の対応

以下のようにすると catch できた。

private void hoge() {
    try {
        // Singletonなクラスの使用
        MySingleton.getInstance().execute();
    } catch (Exception | ExceptionInInitializerError e) {
        logger.error("エラーだよ", e);
    }
}

参考: SingletonとExceptionについて考えてたら、なんだか良く分からなくなってしまいました。 - テツ日記

コメント

このブログの人気の投稿

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

蛍光灯フリッカー現象 (ちらつき) の対策

[node.js] CP932のテキストを読み込む