apache/dubbo · error · IllegalArgumentException

Map pairs can not be odd number.

Error message

Map pairs can not be odd number.

What it means

Thrown by URLBuilder.addParameters(String... pairs) when an odd number of key/value arguments is passed. Parameters must be supplied as alternating key,value,key,value...; an odd count means a value is missing and Dubbo refuses to silently pair a key with null, raising IllegalArgumentException.

Source

Thrown at dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java:384

    @Override
    public URLBuilder addParametersIfAbsent(Map<String, String> parameters) {
        if (CollectionUtils.isEmptyMap(parameters)) {
            return this;
        }
        for (Map.Entry<String, String> entry : parameters.entrySet()) {
            this.parameters.putIfAbsent(entry.getKey(), entry.getValue());
        }
        return this;
    }

    @Override
    public URLBuilder addParameters(String... pairs) {
        if (ArrayUtils.isEmpty(pairs)) {
            return this;
        }
        if (pairs.length % 2 != 0) {
            throw new IllegalArgumentException("Map pairs can not be odd number.");
        }
        Map<String, String> map = new HashMap<>();
        int len = pairs.length / 2;
        for (int i = 0; i < len; i++) {
            map.put(pairs[2 * i], pairs[2 * i + 1]);
        }
        return addParameters(map);
    }

    @Override
    public URLBuilder addParameterString(String query) {
        if (StringUtils.isEmpty(query)) {
            return this;
        }
        return addParameters(StringUtils.parseQueryString(query));
    }

    @Override

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Ensure addParameters is always called with an even number of arguments (key,value pairs).
  2. Build parameters in a Map and use addParameters(Map) instead of the variadic String[] form to avoid pairing mistakes.
  3. Add an assertion/Unit test that pairs.length % 2 == 0 before calling addParameters(String...).

Example fix

// before
builder.addParameters("timeout", "1000", "retries"); // odd -> throws

// after
builder.addParameters("timeout", "1000", "retries", "2");
Defensive patterns

Strategy: validation

Validate before calling

// Assert even arity before calling addParameters(String...)
if (pairs != null && pairs.length % 2 != 0) {
    throw new IllegalArgumentException("addParameters requires even key/value pairs: " + Arrays.toString(pairs));
}
builder.addParameters(pairs);

Prevention

When it happens

Trigger: Calling addParameters("k1","v1","k2") (3 args) or any variadic invocation whose length % 2 != 0; building a pairs array programmatically and appending a key without its value; copy-paste dropping a trailing value.

Common situations: Dynamic parameter assembly that conditionally appends a key but skips its value; list/array construction bug leaving a dangling key; refactor that removed a value but left the key; misusing addParameters where addParameter (single key/value) was intended.

Related errors


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