{"record":{"id":"4dab4cb7863bbab5","repo":"oracle/graal","slug":"unsupported-java-version","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":90,"sourceCode":"        public boolean contains(JavaVersion version) {\n            return version.inRange(low, high);\n        }\n    }\n\n    public static final JavaVersion HOST_VERSION = forVersion(Runtime.version());\n\n    public static final int LATEST_SUPPORTED = 26;\n    public static final int LATEST_SUPPORTED_CLASSFILE = ClassfileParser.JAVA_26_VERSION;\n\n    private final int version;\n\n    JavaVersion(int version) {\n        this.version = version;\n    }\n\n    public static JavaVersion forVersion(int version) {\n        if (version < 1) {\n            throw new IllegalArgumentException(\"Unsupported java version: \" + version);\n        }\n        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);","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/JavaVersion.java#L72-L108","documentation":"JavaVersion.forVersion(int) normalizes a Java feature version number (e.g. 8, 21, 26; LATEST_SUPPORTED is 26). Any value below 1 — zero or negative — is rejected with IllegalArgumentException 'Unsupported java version: <n>'.","triggerScenarios":"Passing 0 or a negative int, often the result of a failed parse or an uninitialized field (0 default), or arithmetic like version - 1 underflowing.","commonSituations":"Parsing '-Djava.version' style strings when a custom parse already returned a sentinel 0/-1; an int field left at its default 0 before configuration; unit tests exercising edge values.","solutions":["Validate the int (>= 1) before calling forVersion and surface your own configuration error naming the source of the bad value","Trace where the 0/negative came from: usually a preceding parse failure left a default or sentinel"],"exampleFix":"// before\nJavaVersion v = JavaVersion.forVersion(parsedVersion); // parsedVersion == 0 from failed parse\n\n// after\nif (parsedVersion < 1) throw new IllegalArgumentException(\"Bad version from config: \" + raw);\nJavaVersion v = JavaVersion.forVersion(parsedVersion);","handlingStrategy":"validation","validationCode":"if (version < 1) throw new IllegalArgumentException(\"version must be >= 1, got \" + version);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never use 0/-1 as a sentinel version — use OptionalInt or an explicit error","Assert parsed versions are within [1, JavaVersion.LATEST_SUPPORTED] in configuration code"],"tags":["espresso","classfile","version","validation"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}