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));
}
@OverrideView on GitHub (pinned to 3a3043227f)
Solutions
- Ensure addParameters is always called with an even number of arguments (key,value pairs).
- Build parameters in a Map and use addParameters(Map) instead of the variadic String[] form to avoid pairing mistakes.
- 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
- Prefer addParameters(Map) over the variadic String[] form.
- Build the pairs array from a Map to guarantee pairing.
- Add a unit test asserting even arity for dynamically built pairs.
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
- defaultValue <= 0
- Invalid url, password without username!
- Invalid url, password without username!
- url missing protocol: "${fullURLStr}"
- The address of metadata report is invalid.
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/46446747348416a8.
Report an issue: GitHub.