修复无法解析部分 Java 版本号的问题 (#3759)

* 修复无法解析部分 Java 版本号的问题

* update

* update
This commit is contained in:
Glavo
2025-03-22 12:17:13 +08:00
committed by GitHub
parent e8ff42c4b2
commit e2f50c92e9
2 changed files with 23 additions and 17 deletions

View File

@@ -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;
}
}

View File

@@ -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(""));
}
}