diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java index d23f5a46a..b39b4fd60 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java @@ -38,25 +38,23 @@ import java.nio.file.Path; * @author Glavo */ public final class JavaInfo { + public static int parseVersion(String version) { + int startIndex = version.startsWith("1.") ? 2 : 0; + int endIndex = startIndex; + + while (endIndex < version.length()) { + char ch = version.charAt(endIndex); + if (ch >= '0' && ch <= '9') + endIndex++; + else + break; + } + try { - int idx = version.indexOf('.'); - if (idx < 0) { - idx = version.indexOf('u'); - return idx > 0 ? Integer.parseInt(version.substring(0, idx)) : Integer.parseInt(version); - } else { - int major = Integer.parseInt(version.substring(0, idx)); - if (major != 1) { - return major; - } else { - int idx2 = version.indexOf('.', idx + 1); - if (idx2 < 0) { - return -1; - } - return Integer.parseInt(version.substring(idx + 1, idx2)); - } - } - } catch (NumberFormatException e) { + return endIndex > startIndex ? Integer.parseInt(version.substring(startIndex, endIndex)) : -1; + } catch (Throwable e) { + // The version number is too long return -1; } } diff --git a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java index 00065986c..a4b2c9c87 100644 --- a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java +++ b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/platform/JavaRuntimeTest.java @@ -12,7 +12,15 @@ public final class JavaRuntimeTest { @Test public void testParseVersion() { assertEquals(8, parseVersion("1.8.0_302")); + assertEquals(8, parseVersion("1.8-internal")); assertEquals(11, parseVersion("11")); assertEquals(11, parseVersion("11.0.12")); + assertEquals(11, parseVersion("11-internal")); + assertEquals(11, parseVersion("11+abc")); + + assertEquals(-1, parseVersion("abc")); + assertEquals(-1, parseVersion("1.")); + assertEquals(-1, parseVersion("1.-internal")); + assertEquals(-1, parseVersion("")); } }