From 34f7774ce955e0f46b71c37e95aca475d8488f3a Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 30 Jun 2018 21:36:57 +0800 Subject: [PATCH] Fix NPE when the game launched and suddenly crashes --- .../org/jackhuang/hmcl/game/LauncherHelper.java | 16 ++++++++++------ .../java/org/jackhuang/hmcl/ui/Controllers.java | 7 ++++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 33504b62f..8fbdbf4ae 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -172,13 +172,17 @@ public final class LauncherHelper { @Override public void onStop(boolean success, TaskExecutor executor) { - if (!success) { + if (!success && !Controllers.isStopped()) { Platform.runLater(() -> { - Controllers.closeDialog(launchingStepsPane); - if (executor.getLastException() != null) - Controllers.dialog(I18nException.getStackTrace(executor.getLastException()), - scriptFile == null ? Launcher.i18n("launch.failed") : Launcher.i18n("version.launch_script.failed"), - MessageBox.ERROR_MESSAGE); + // Check if the application has stopped + // because onStop will be invoked if tasks fail when the executor service shut down. + if (!Controllers.isStopped()) { + Controllers.closeDialog(launchingStepsPane); + if (executor.getLastException() != null) + Controllers.dialog(I18nException.getStackTrace(executor.getLastException()), + scriptFile == null ? Launcher.i18n("launch.failed") : Launcher.i18n("version.launch_script.failed"), + MessageBox.ERROR_MESSAGE); + } }); } launchingStepsPane.setExecutor(null); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index ca44cac28..4ae3bd74f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -157,7 +157,8 @@ public final class Controllers { } public static void closeDialog(Region content) { - + if (stage == null) // shut down + return; decorator.closeDialog(content); } @@ -174,6 +175,10 @@ public final class Controllers { getLeftPaneController().showUpdate(); } + public static boolean isStopped() { + return decorator == null; + } + public static void shutdown() { mainPage = null; settingsPage = null;