oracle/graal · error · IllegalArgumentException

At least one non-zero version must be specified.

Error message

At least one non-zero version must be specified.

What it means

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.

Source

Thrown at sdk/src/org.graalvm.home/src/org/graalvm/home/Version.java:390

     */
    public static Version parse(String versionString) throws IllegalArgumentException {
        Objects.requireNonNull(versionString);
        return new Version(versionString);
    }

    /**
     * Constructs a new GraalVM version from a list of version numbers. The versions must not be
     * <code>null</code> and none of the version numbers must be negative. At least one version
     * number must be non-zero.
     *
     * @see #compareTo(int...)
     * @since 19.3
     */
    public static Version create(int... versions) throws IllegalArgumentException {
        Objects.requireNonNull(versions);
        int[] useVersions = trimTrailingZeros(versions);
        if (useVersions.length == 0) {
            throw new IllegalArgumentException("At least one non-zero version must be specified.");
        }
        for (int i = 0; i < useVersions.length; i++) {
            if (useVersions[i] < 0) {
                throw new IllegalArgumentException("Versions must not be negative.");
            }
        }
        return new Version(useVersions);
    }

    /**
     * Returns the current GraalVM version of the installed component. Never <code>null</code>.
     *
     * @see HomeFinder#getVersion()
     * @since 19.3
     */
    public static Version getCurrent() {
        return parse(HomeFinder.getInstance().getVersion());
    }

View on GitHub (pinned to a66e9ccd1d)

Solutions

  1. Validate before creating: if all components are 0 (or the array is empty), skip/reject rather than call Version.create.
  2. 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.
  3. When parsing, require at least one numeric component and reject empty strings before building the int array.

Example fix

// before
Version v = Version.create(major, minor, rev); // all 0 when parse failed

// after
if (major == 0 && minor == 0 && rev == 0) {
    throw new IllegalArgumentException("Invalid version string: " + input);
}
Version v = Version.create(major, minor, rev);
Defensive patterns

Strategy: validation

Validate before calling

static boolean isCreatable(int... comps) {
    for (int c : comps) {
        if (c != 0) return true;
    }
    return false; // Version.create would throw
}

Try / catch

try {
    Version v = Version.create(comps);
} catch (IllegalArgumentException e) {
    // unparsable or all-zero input; use fallback e.g. Version.create(1)
    Version v = Version.create(1);
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of oracle/graal@a66e9ccd1d (2026-08-14). Data as JSON: /api/errors/a69d89e8448871b7. Report an issue: GitHub.