JavaFX アプリケーションで、予期しない例外が発生するたびにエラー ダイアログを表示してアプリを終了したいと考えています。だから私のメインメソッドでは、アプリを起動する前にデフォルトのキャッチされていない例外ハンドラーを設定しました:
setDefaultUncaughtExceptionHandler((thread, cause) -> {
try {
cause.printStackTrace();
final Runnable showDialog = () -> {
// create dialog and show
};
if (Platform.isFxApplicationThread()) {
showDialog.run();
} else {
runAndWait(showDialog);
}
} catch (Throwable t) {
// ???
} finally {
System.exit(-1);
}
});
launch(MyApp.class);
説明: キャッチされていない例外ハンドラーが JavaFX アプリケーション スレッド (FXAT) で実行されると、ダイアログを表示するためのコードを実行するだけです。もちろん、例外ハンドラが FXAT によって呼び出されない場合、これは機能しません。この場合、コードを FXAT にプッシュする必要があります。しかしPlatform.runLater
、ダイアログが表示される前にアプリが終了するため、使用できません。runAndWait
そこで、ランナブルを 経由で内部的にプッシュするカスタム メソッドを作成しましたPlatform.runLater
が、ランナブルの実行まで待機します (カウントダウン ラッチ メカニズムを使用)。
これに関する問題: start() メソッドで例外が発生すると、アプリが動かなくなります。ダイアログが表示されるまで待機しようとしますが、FXAT は決してこの実行を行いません。これは、start() メソッドが例外で失敗した場合、FXAT が死んでいるからだと思いますか? これが start() メソッドの特殊なケースなのか、それとも例外がスローされ、FXAT によって実行されるコード内でキャッチされない場合に発生するのかはわかりません。
私が知っているように、Swing では、EDT は複数のスレッドで構成される複雑なアーキテクチャです。EDT での実行の一部が失敗したときに Swing 全体が壊れたということはありませんでした。しかし、これは何が起こっているようですか?
ここで何ができますか?アプリケーションを起動できないことをユーザーに示すにはどうすればよいですか?