0


今日は奇妙な問題がありました...「何千もの言葉に値する」ので、単純化した例を作成します:D

public class Application() {
    public static void main(String[] args) {
        try {
            A a = new A(); // this may throw exceptions
                           // (which will cause an ExceptionInInitializerError)
        } catch (Throwable t) {
            JOptionPane.showMessageDialog(null, "Oooops!");
            System.exit(1);
        }
    }
}

これは Swing GUI を備えたスタンドアロン アプリケーションであるため、問題が発生した場合 (この場合は起動時) にユーザーにメッセージを表示することが私の目標です。上記のコードは Eclipse IDE で動作しますが、プロジェクトをエクスポートするとそれをダブルクリックして実行可能なjarとして、まあ、開かないだけです。

だから私はそれをcmdで実行しようとすると、java -jar application.jarシェルに..ExceptionInInitializerError

エラーがキャッチされなかったのはなぜですか?
指定しても動きませんcatch (ExceptionInInitializerError e)

編集: より詳細なデバッグの後、この問題は2つの特定の例外が発生し、後者が前者のcatchブロックで発生した場合にのみ発生することがわかりました。起動時に行ういくつかのチェックの順序を変更して、バグを修正しました。

この問題は、静的ブロックにロードする JDBC ドライバー クラス名の自発的な間違いによって発生したため、決して発生することはありません。

少なくとも、コンストラクターと静的初期化ブロックが例外をスローしてはならない理由を明確に理解できました。例外をスローするクラスが多くのクラスで使用されている場合、見つけるのが非常に難しくなる可能性があるため、デバッグがほとんど不可能になります。クラスがロードされたときに出力されます。

4

1 に答える 1

0

ExceptionInInitializerErrorあなたの例に引っかからないことについて、3つの可能な説明を考えることができます:

  • によって投げられている可能性がありますJOptionPane.showMessageDialog(null, "Oooops!");

  • mainが呼び出される前にスローされる可能性があります。

  • 別のスタックでスローされる可能性があります。

ExceptionInInitializerError実際、クラスの初期化中に未チェックの例外がスローされた(キャッチされなかった)ときにスローされるため、2番目の可能性が最も高いと思います。tryそれは、ブロックに入る前に起こっている可能性があります。

于 2012-09-19T12:55:36.437 に答える