{"record":{"id":"a69d89e8448871b7","repo":"oracle/graal","slug":"at-least-one-non-zero-version-must-be-specified","errorCode":null,"errorMessage":"At least one non-zero version must be specified.","messagePattern":"At least one non-zero version must be specified\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdk/src/org.graalvm.home/src/org/graalvm/home/Version.java","lineNumber":390,"sourceCode":"     */\n    public static Version parse(String versionString) throws IllegalArgumentException {\n        Objects.requireNonNull(versionString);\n        return new Version(versionString);\n    }\n\n    /**\n     * Constructs a new GraalVM version from a list of version numbers. The versions must not be\n     * <code>null</code> and none of the version numbers must be negative. At least one version\n     * number must be non-zero.\n     *\n     * @see #compareTo(int...)\n     * @since 19.3\n     */\n    public static Version create(int... versions) throws IllegalArgumentException {\n        Objects.requireNonNull(versions);\n        int[] useVersions = trimTrailingZeros(versions);\n        if (useVersions.length == 0) {\n            throw new IllegalArgumentException(\"At least one non-zero version must be specified.\");\n        }\n        for (int i = 0; i < useVersions.length; i++) {\n            if (useVersions[i] < 0) {\n                throw new IllegalArgumentException(\"Versions must not be negative.\");\n            }\n        }\n        return new Version(useVersions);\n    }\n\n    /**\n     * Returns the current GraalVM version of the installed component. Never <code>null</code>.\n     *\n     * @see HomeFinder#getVersion()\n     * @since 19.3\n     */\n    public static Version getCurrent() {\n        return parse(HomeFinder.getInstance().getVersion());\n    }","sourceCodeStart":372,"sourceCodeEnd":408,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/sdk/src/org.graalvm.home/src/org/graalvm/home/Version.java#L372-L408","documentation":"Version.create(int... versions) trims trailing zeros and then requires at least one non-zero component; an all-zero (or empty after trimming) input throws IllegalArgumentException('At least one non-zero version must be specified.'). A Version must be orderable and distinguishable from nothing, so '0' / '0.0.0' / {} are not constructible. Negative components throw a separate 'Versions must not be negative.' error.","triggerScenarios":"Calling Version.create(), Version.create(0), Version.create(0, 0), or Version.create(0, 0, 0); building a Version from parsed digits where every field defaulted to 0 (e.g. parsing an empty or malformed version string produced all zeros); tests constructing boundary-case versions.","commonSituations":"Parsing code that splits a version string on '.' and converts fields with a default of 0, then calls create() even when nothing was parsed; feature gating that computes a version from environment variables which are unset; placeholder version objects during development.","solutions":["Validate before creating: if all components are 0 (or the array is empty), skip/reject rather than call Version.create.","Treat an unparsable/empty version string as 'unknown' in your own code path (e.g. fall back to Version.current() or a minimum supported Version.create(1)) instead of forwarding zeros.","When parsing, require at least one numeric component and reject empty strings before building the int array."],"exampleFix":"// before\nVersion v = Version.create(major, minor, rev); // all 0 when parse failed\n\n// after\nif (major == 0 && minor == 0 && rev == 0) {\n    throw new IllegalArgumentException(\"Invalid version string: \" + input);\n}\nVersion v = Version.create(major, minor, rev);","handlingStrategy":"validation","validationCode":"static boolean isCreatable(int... comps) {\n    for (int c : comps) {\n        if (c != 0) return true;\n    }\n    return false; // Version.create would throw\n}","typeGuard":null,"tryCatchPattern":"try {\n    Version v = Version.create(comps);\n} catch (IllegalArgumentException e) {\n    // unparsable or all-zero input; use fallback e.g. Version.create(1)\n    Version v = Version.create(1);\n}","preventionTips":["Reject empty/all-zero version inputs at parse time with your own error message.","Default failed parses to a known minimum version, not to zeros.","Unit-test version parsing against '', '0', and '0.0' inputs."],"tags":["graalvm","home","version","validation"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}