apache/dubbo · error · IllegalArgumentException

defaultValue <= 0

Error message

defaultValue <= 0

What it means

Thrown by getPositiveServiceParameter(service, key, double defaultValue) when the caller passes a defaultValue that is <= 0. The 'positive' accessors enforce that the fallback itself is strictly positive so the returned value can never be zero/negative; a non-positive default is a programming error and is rejected immediately with IllegalArgumentException before any lookup.

Source

Thrown at dubbo-common/src/main/java/org/apache/dubbo/common/URL.java:1759

        return StringUtils.isEmpty(value) ? defaultValue : Boolean.parseBoolean(value);
    }

    public boolean hasServiceParameter(String service, String key) {
        String value = getServiceParameter(service, key);
        return StringUtils.isNotEmpty(value);
    }

    public float getPositiveServiceParameter(String service, String key, float defaultValue) {
        if (defaultValue <= 0) {
            throw new IllegalArgumentException("defaultValue <= 0");
        }
        float value = getServiceParameter(service, key, defaultValue);
        return value <= 0 ? defaultValue : value;
    }

    public double getPositiveServiceParameter(String service, String key, double defaultValue) {
        if (defaultValue <= 0) {
            throw new IllegalArgumentException("defaultValue <= 0");
        }
        double value = getServiceParameter(service, key, defaultValue);
        return value <= 0 ? defaultValue : value;
    }

    public long getPositiveServiceParameter(String service, String key, long defaultValue) {
        if (defaultValue <= 0) {
            throw new IllegalArgumentException("defaultValue <= 0");
        }
        long value = getServiceParameter(service, key, defaultValue);
        return value <= 0 ? defaultValue : value;
    }

    public int getPositiveServiceParameter(String service, String key, int defaultValue) {
        if (defaultValue <= 0) {
            throw new IllegalArgumentException("defaultValue <= 0");
        }
        int value = getServiceParameter(service, key, defaultValue);

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Pass a genuinely positive default value (e.g. the documented default timeout/weight) instead of 0.
  2. If zero/negative should be allowed, use getServiceParameter(...) (the non-positive variant) instead of getPositiveServiceParameter.
  3. Initialize the field holding the default with a real positive constant so it never evaluates to <= 0 at the call site.

Example fix

// before
int timeout = url.getPositiveServiceParameter(svc, "timeout", 0); // throws

// after
double factor = url.getPositiveServiceParameter(svc, "factor", 1.0);
Defensive patterns

Strategy: validation

Validate before calling

// Ensure a strictly positive default before calling the positive accessor
if (defaultValue <= 0) {
    throw new IllegalArgumentException("defaultValue must be > 0 for key " + key);
}

Prevention

When it happens

Trigger: Calling url.getPositiveServiceParameter(service, key, <someDouble>) with a literal 0, negative number, or a computed default that evaluates to <= 0 (e.g. an uninitialized field defaulting to 0.0). The check fires at call time, independent of the actual configured value.

Common situations: Passing 0 as a placeholder default instead of a real positive fallback; a timeout/retry/weight default field left at its JVM zero default; copy-pasting a getPositive* call without supplying a meaningful default; mixing primitive defaults that silently zero-initialize.

Related errors


AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14). Data as JSON: /api/errors/39578b386019b478. Report an issue: GitHub.