В моем приложении JavaFX я хочу показать диалоговое окно с ошибкой и выйти из приложения, когда возникает какое-то неожиданное исключение. Так что в моем главном-методе я настроил неперехваченный обработчик исключений по умолчанию перед запуском приложения:JavaFX: Как показать диалоговое окно с ошибкой при запуске метода start?
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 Application (FXAT), я просто запустить код для отображения диалога. Это, конечно, не работает, когда обработчик исключений не вызывается FXAT. В этом случае я должен нажать код на FXAT. Но я не могу использовать Platform.runLater
, потому что тогда мое приложение выйдет до появления диалогового окна. Итак, я сделал этот настраиваемый метод runAndWait
, который внутренне выталкивает runnable через Platform.runLater
, но ждет выполнения исполняемого файла (с некоторым механизмом задержек обратного отсчета).
Теперь проблема с этим: когда в моем методе start() возникает исключение, мое приложение застревает. Поскольку он пытается подождать, пока не покажет выполнение диалогового окна, но FXAT никогда не выполняет это выполнение. Я думаю, это потому, что, когда метод start() выходит из строя с исключением, FXAT просто мертв? Я не уверен, является ли это особым случаем для метода start(), или это произойдет в любой ситуации, когда исключение выбрано и не попадает в код, который выполняется FXAT.
В Swing, как я знаю, EDT представляет собой сложную архитектуру, состоящую из нескольких потоков. Дело не в том, что когда какое-то исполнение на EDT потерпело неудачу, весь Swing сломался. Но вот что, похоже, происходит?
Так что я могу здесь сделать? Как я могу показать пользователю, что приложение не может запустить?
«Я не могу использовать' Platform.runLater() ', потому что тогда мое приложение завершит работу до появления диалогового окна». Вызывает ли это 'Platform.setImplicitExit (false);' исправляет это? –
нет конечно нет. причиной выхода приложения является вызов System.exit() в моем обработчике исключений. – user3237736
Подожди, я идиот. забудьте эту точку, когда программа выходит слишком рано. потому что я мог просто переместить вызов System.exit в Runnable для потока FX. Тем не менее, основная проблема заключается в том, что я не могу ничего запускать в потоке FX, когда метод start генерирует исключение. – user3237736