From 6c8c189b72a80941787c5c93057033e56a09e28d Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 9 Jan 2016 13:24:40 +0800 Subject: [PATCH] fix IllegalStateException crashes the application --- .../launcher/launch/GameException.java | 30 ++ .../launcher/launch/GameLauncher.java | 18 +- .../launcher/launch/MinecraftLoader.java | 2 +- .../utils/auth/OfflineAuthenticator.java | 8 +- .../launcher/version/MinecraftVersion.java | 4 +- .../version/MinecraftVersionManager.java | 5 +- .../launcher/views/GameSettingsPanel.java | 9 +- .../HelloMinecraftLookAndFeel.java | 9 +- .../hellominecraft/lookandfeel/Theme.java | 2 + .../lookandfeel/synth_backup.xml | 393 ++++++++++++++++++ 10 files changed, 453 insertions(+), 27 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameException.java create mode 100644 MetroLookAndFeel/src/main/resources/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameException.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameException.java new file mode 100644 index 000000000..df5c38372 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameException.java @@ -0,0 +1,30 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hellominecraft.launcher.launch; + +/** + * + * @author huangyuhui + */ +public class GameException extends RuntimeException { + + public GameException(String message) { + super(message); + } + +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java index 24f691136..0bff522b4 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java @@ -85,13 +85,8 @@ public class GameLauncher { try { loader = provider.provideMinecraftLoader(result); - } catch (IllegalStateException e) { - HMCLog.err("Failed to get minecraft loader", e); - failEvent.execute(C.i18n("launch.circular_dependency_versions")); - return null; - } catch (Exception e) { - failEvent.execute(C.i18n("launch.failed")); - HMCLog.err("Failed to get minecraft loader", e); + } catch (GameException e) { + failEvent.execute(C.i18n("launch.failed") + ", " + e.getMessage()); return null; } @@ -106,7 +101,14 @@ public class GameLauncher { } HMCLog.log("Unpacking natives..."); - if (!decompressNativesEvent.execute(provider.getDecompressLibraries(loader.getMinecraftVersion()))) { + DecompressLibraryJob job = null; + try { + job = provider.getDecompressLibraries(loader.getMinecraftVersion()); + } catch (GameException e) { + failEvent.execute(C.i18n("launch.failed") + ", " + e.getMessage()); + return null; + } + if (!decompressNativesEvent.execute(job)) { failEvent.execute(C.i18n("launch.failed")); return null; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java index 44b8b2caf..6d91073ac 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java @@ -48,7 +48,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { DownloadType dt; String text; - public MinecraftLoader(Profile ver, IMinecraftProvider provider, UserProfileProvider lr) throws IllegalStateException { + public MinecraftLoader(Profile ver, IMinecraftProvider provider, UserProfileProvider lr) throws GameException { super(ver, provider, lr); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java index 389c7c040..c52ac96cd 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java @@ -29,7 +29,7 @@ import org.jackhuang.hellominecraft.utils.code.DigestUtils; */ public final class OfflineAuthenticator extends IAuthenticator { - Map uuidMap = null; + Map uuidMap = new HashMap<>(); public OfflineAuthenticator(String clientToken) { super(clientToken); @@ -38,11 +38,11 @@ public final class OfflineAuthenticator extends IAuthenticator { @Override public void onLoadSettings(Map m) { super.onLoadSettings(m); + if (m == null) + return; Object o = m.get("uuidMap"); if (o != null && o instanceof Map) - uuidMap = (Map) o; - else - uuidMap = new HashMap<>(); + uuidMap = (Map) o; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java index c7e96e9f6..dda54564d 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersion.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.jackhuang.hellominecraft.C; +import org.jackhuang.hellominecraft.launcher.launch.GameException; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.utils.assets.AssetsIndex; import org.jackhuang.hellominecraft.utils.ArrayUtils; @@ -78,7 +80,7 @@ public class MinecraftVersion implements Cloneable, Comparable if (inheritsFrom == null) return this; if (!resolvedSoFar.add(id)) - throw new IllegalStateException("Circular dependency detected."); + throw new GameException(C.i18n("launch.circular_dependency_versions")); MinecraftVersion parent = manager.getVersionById(inheritsFrom); if (parent == null) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java index 117621b44..b4705cd8b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.TreeMap; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; +import org.jackhuang.hellominecraft.launcher.launch.GameException; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftAssetService; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftDownloadService; @@ -211,7 +212,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public GameLauncher.DecompressLibraryJob getDecompressLibraries(MinecraftVersion v) { if (v.libraries == null) - throw new IllegalStateException("Wrong format: minecraft.json"); + throw new GameException("Wrong format: minecraft.json"); ArrayList unzippings = new ArrayList<>(); ArrayList extractRules = new ArrayList<>(); for (IMinecraftLibrary l : v.libraries) { @@ -236,7 +237,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public IMinecraftLoader provideMinecraftLoader(UserProfileProvider p) - throws IllegalStateException { + throws GameException { return new MinecraftLoader(profile, this, p); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index b52fd05c4..52f0d44c2 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -896,11 +896,8 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private void btnRemoveProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveProfileActionPerformed if (MessageBox.Show(C.i18n("ui.message.sure_remove", getProfile().getName()), MessageBox.YES_NO_OPTION) == MessageBox.NO_OPTION) return; - String name = getProfile().getName(); - if (Settings.delProfile(getProfile())) { - cboProfiles.removeItem(name); - prepare(getProfile()); - } + if (Settings.delProfile(getProfile())) + loadProfiles(); }//GEN-LAST:event_btnRemoveProfileActionPerformed private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged @@ -1197,8 +1194,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget } // - // - // // String getMinecraftVersionFormatted() { return minecraftVersion == null ? "" : (StrUtils.formatVersion(minecraftVersion.version) == null) ? mcVersion : minecraftVersion.version; diff --git a/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java b/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java index c0565eb13..0c8f7d555 100755 --- a/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java +++ b/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java @@ -23,6 +23,7 @@ import java.text.ParseException; import java.util.Map; import javax.swing.UIDefaults; import javax.swing.plaf.synth.SynthLookAndFeel; +import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.NetUtils; /** @@ -37,7 +38,7 @@ public class HelloMinecraftLookAndFeel extends SynthLookAndFeel { * Creates a new instance of NimbusLookAndFeel * * @throws java.text.ParseException error parsing the xml, it must not - * happen. + * happen. */ public HelloMinecraftLookAndFeel() throws ParseException { this(DEFAULT_SETTINGS); @@ -49,9 +50,9 @@ public class HelloMinecraftLookAndFeel extends SynthLookAndFeel { for (String ss : settings.keySet()) s = s.replace("${" + ss + "}", settings.get(ss)); load(new ByteArrayInputStream(s.getBytes("UTF-8")), HelloMinecraftLookAndFeel.class); - } catch (IOException ex) { - ex.printStackTrace(); - throw new ParseException("FUCKING BUG", 0); + } catch (Throwable ex) { + HMCLog.err("This fucking exception should not happen. Retry backup solution.", ex); + load(HelloMinecraftLookAndFeel.class.getResourceAsStream("/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml"), HelloMinecraftLookAndFeel.class); } } diff --git a/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/Theme.java b/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/Theme.java index 9ff01a8c3..2fec01b83 100755 --- a/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/Theme.java +++ b/MetroLookAndFeel/src/main/java/org/jackhuang/hellominecraft/lookandfeel/Theme.java @@ -79,6 +79,8 @@ public enum Theme { public final Map settings; private Theme(String localizedName, Map settings) { + if (settings == null) + throw new NullPointerException("Theme settings map should not be null."); this.localizedName = localizedName; this.settings = settings; } diff --git a/MetroLookAndFeel/src/main/resources/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml b/MetroLookAndFeel/src/main/resources/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml new file mode 100644 index 000000000..5324dd5d6 --- /dev/null +++ b/MetroLookAndFeel/src/main/resources/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file