{"record":{"id":"3e3cf6eeb2379cfb","repo":"alibaba/arthas","slug":"cannot-convert-to-char-value","errorCode":null,"errorMessage":"Cannot convert to char: {value}","messagePattern":"Cannot convert to char: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"arthas-mcp-server/src/main/java/com/taobao/arthas/mcp/server/util/JsonParser.java","lineNumber":178,"sourceCode":"\t\telse if (javaType == Long.class) {\n\t\t\tBigDecimal bigDecimal = new BigDecimal(value.toString());\n\t\t\treturn bigDecimal.longValueExact();\n\t\t}\n\t\telse if (javaType == Double.class) {\n\t\t\treturn Double.parseDouble(value.toString());\n\t\t}\n\t\telse if (javaType == Float.class) {\n\t\t\treturn Float.parseFloat(value.toString());\n\t\t}\n\t\telse if (javaType == Boolean.class) {\n\t\t\treturn Boolean.parseBoolean(value.toString());\n\t\t}\n\t\telse if (javaType == Character.class) {\n\t\t\tString s = value.toString();\n\t\t\tif (s.length() == 1) {\n\t\t\t\treturn s.charAt(0);\n\t\t\t}\n\t\t\tthrow new IllegalArgumentException(\"Cannot convert to char: \" + value);\n\t\t}\n\t\telse if (javaType.isEnum()) {\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tClass<Enum> enumType = (Class<Enum>) javaType;\n\t\t\treturn Enum.valueOf(enumType, value.toString());\n\t\t}\n\n\n\t\tString json = JsonParser.toJson(value);\n\t\treturn JsonParser.fromJson(json, javaType);\n\t}\n\n\tpublic static Class<?> resolvePrimitiveIfNecessary(Class<?> type) {\n\t\tif (type.isPrimitive()) {\n\t\t\treturn Utils.getWrapperClassForPrimitive(type);\n\t\t}\n\t\treturn type;\n\t}","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/alibaba/arthas/blob/21cf2e9ba52b305290be7223b980ff504bb9cb5b/arthas-mcp-server/src/main/java/com/taobao/arthas/mcp/server/util/JsonParser.java#L160-L196","documentation":"JsonParser.convertValue handles primitive boxing for Character by calling value.toString() and requiring exactly length 1; otherwise it throws IllegalArgumentException(\"Cannot convert to char: <value>\"). This is the narrow Character branch — enums, numbers, booleans each have their own branches.","triggerScenarios":"Converting a value whose string form is empty or longer than one character (e.g. \"ab\", \"\", \"true\") into a Character/char target type via convertValue.","commonSituations":"A tool/method parameter typed as char or Character receives a multi-character string; numeric or boolean source value being coerced into a char field; reflective binding mismatch.","solutions":["Ensure the source value is exactly one character when the target type is char/Character.","Change the target parameter type to String if multi-character input is legitimate.","Pre-validate length == 1 before calling convertValue for char-typed fields."],"exampleFix":"// before\nchar c = (char) JsonParser.convertValue(raw, Character.class);  // raw = \"ab\" -> throws\n\n// after\nString s = String.valueOf(raw);\nif (s.length() != 1) throw new IllegalArgumentException(\"expected single char, got: \" + s);\nchar c = s.charAt(0);","handlingStrategy":"validation","validationCode":"String s = value == null ? \"\" : value.toString();\nif (targetType == Character.class || targetType == char.class) {\n    if (s.length() != 1) throw new IllegalArgumentException(\"expected single char, got: \" + s);\n}","typeGuard":"static boolean isSingleChar(Object v) {\n    return v != null && v.toString().length() == 1;\n}","tryCatchPattern":"try {\n    return JsonParser.convertValue(raw, Character.class);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Cannot convert to char\")) {\n        return null; // or a default char\n    }\n    throw e;\n}","preventionTips":["Pre-validate length == 1 for any char/Character target.","Prefer String parameters when input may exceed one character.","Unit-test coercion of numeric/boolean values into char fields."],"tags":["json","type-coercion","char","reflection"],"backgroundTag":null,"analyzedSha":"21cf2e9ba52b305290be7223b980ff504bb9cb5b","analyzedAt":"2026-08-14T00:57:07.243Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}