{"record":{"id":"ba40912912bc309a","repo":"oracle/graal","slug":"unsupported-java-version-ba4091","errorCode":null,"errorMessage":"Unsupported java version: {} ({})","messagePattern":"Unsupported java version: (.+?) \\((.+?)\\)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/JavaVersion.java","lineNumber":110,"sourceCode":"        return new JavaVersion(version);\n    }\n\n    public static JavaVersion forVersion(String version) {\n        int begin = 0;\n        int end = version.length();\n        if (version.startsWith(\"1.\")) {\n            begin = 2;\n        }\n        int firstDot = version.indexOf('.', begin);\n        if (firstDot >= 0) {\n            end = firstDot;\n        }\n        String normalizedVersion = version.substring(begin, end);\n        try {\n            int intVersion = Integer.parseInt(normalizedVersion);\n            return forVersion(intVersion);\n        } catch (NumberFormatException e) {\n            throw new IllegalArgumentException(\"Unsupported java version: \" + version + \" (\" + normalizedVersion + \")\");\n        }\n    }\n\n    public Runtime.Version toRunTimeVersion() {\n        return Runtime.Version.parse(toString());\n    }\n\n    private static JavaVersion forVersion(Runtime.Version version) {\n        return forVersion(version.feature());\n    }\n\n    public static JavaVersion latestSupported() {\n        return forVersion(LATEST_SUPPORTED);\n    }\n\n    public boolean java8OrEarlier() {\n        return version <= 8;\n    }","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/JavaVersion.java#L92-L128","documentation":"JavaVersion.forVersion(String) strips an optional '1.' prefix (1.8 -> 8) and takes everything up to the next dot, then Integer.parseInt. If that normalized substring is not an integer, NumberFormatException is wrapped in IllegalArgumentException showing both the original and normalized version.","triggerScenarios":"Passing strings like 'abc', '1.x', 'v17', '17-pre2', '8u40', or '' (empty) — any version string whose leading dot-free segment is not purely digits.","commonSituations":"Feeding System.getProperty('java.version') raw values from old JDKs ('1.8.0_282' works, but '8u40' or '17-ea' do not), user-supplied --release style flags, or build metadata accidentally concatenated to the version string.","solutions":["Normalize first: strip prefixes/suffixes and keep only the leading digit run (e.g. regex ^(1\\.)?(\\d+)) before calling forVersion","For runtime use Runtime.Version.parse(...).feature() and the Runtime.Version overload instead of hand-parsing strings","Reject empty/blank input early with a clear configuration error"],"exampleFix":"// before\nJavaVersion v = JavaVersion.forVersion(\"17-ea\"); // NumberFormatException on '17-ea'\n\n// after\nMatcher m = Pattern.compile(\"^(?:1\\.)?(\\d+)\").matcher(version);\nJavaVersion v = m.find() ? JavaVersion.forVersion(Integer.parseInt(m.group(1))) : JavaVersion.latestSupported();","handlingStrategy":"validation","validationCode":"Matcher m = Pattern.compile(\"^(?:1\\.)?(\\d+)\").matcher(version);\nif (!m.find()) throw new IllegalArgumentException(\"Unparseable version: \" + version);\nJavaVersion.forVersion(Integer.parseInt(m.group(1)));","typeGuard":"static boolean isParsableVersion(String s) { return s != null && Pattern.compile(\"^(?:1\\.)?\\d+\").matcher(s).find(); }","tryCatchPattern":"catch (IllegalArgumentException e) { show original and normalized strings, reject the config input }","preventionTips":["Prefer Runtime.Version.parse(...).feature() for JDK version strings","Strip suffixes like 'u40', '-ea', '_282' before handing the string over"],"tags":["espresso","classfile","version","parsing"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}