今日は奇妙な問題がありました...「何千もの言葉に値する」ので、単純化した例を作成します: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 ドライバー クラス名の自発的な間違いによって発生したため、決して発生することはありません。
少なくとも、コンストラクターと静的初期化ブロックが例外をスローしてはならない理由を明確に理解できました。例外をスローするクラスが多くのクラスで使用されている場合、見つけるのが非常に難しくなる可能性があるため、デバッグがほとんど不可能になります。クラスがロードされたときに出力されます。