{"record":{"id":"46446747348416a8","repo":"apache/dubbo","slug":"map-pairs-can-not-be-odd-number","errorCode":null,"errorMessage":"Map pairs can not be odd number.","messagePattern":"Map pairs can not be odd number\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java","lineNumber":384,"sourceCode":"\n    @Override\n    public URLBuilder addParametersIfAbsent(Map<String, String> parameters) {\n        if (CollectionUtils.isEmptyMap(parameters)) {\n            return this;\n        }\n        for (Map.Entry<String, String> entry : parameters.entrySet()) {\n            this.parameters.putIfAbsent(entry.getKey(), entry.getValue());\n        }\n        return this;\n    }\n\n    @Override\n    public URLBuilder addParameters(String... pairs) {\n        if (ArrayUtils.isEmpty(pairs)) {\n            return this;\n        }\n        if (pairs.length % 2 != 0) {\n            throw new IllegalArgumentException(\"Map pairs can not be odd number.\");\n        }\n        Map<String, String> map = new HashMap<>();\n        int len = pairs.length / 2;\n        for (int i = 0; i < len; i++) {\n            map.put(pairs[2 * i], pairs[2 * i + 1]);\n        }\n        return addParameters(map);\n    }\n\n    @Override\n    public URLBuilder addParameterString(String query) {\n        if (StringUtils.isEmpty(query)) {\n            return this;\n        }\n        return addParameters(StringUtils.parseQueryString(query));\n    }\n\n    @Override","sourceCodeStart":366,"sourceCodeEnd":402,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java#L366-L402","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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...)."],"exampleFix":"// before\nbuilder.addParameters(\"timeout\", \"1000\", \"retries\"); // odd -> throws\n\n// after\nbuilder.addParameters(\"timeout\", \"1000\", \"retries\", \"2\");","handlingStrategy":"validation","validationCode":"// Assert even arity before calling addParameters(String...)\nif (pairs != null && pairs.length % 2 != 0) {\n    throw new IllegalArgumentException(\"addParameters requires even key/value pairs: \" + Arrays.toString(pairs));\n}\nbuilder.addParameters(pairs);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["url","urlbuilder","parameter","validation","programmer-error"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}