alibaba/arthas · error · IllegalArgumentException
Cannot convert to char: {value}
Error message
Cannot convert to char: {value} What it means
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.
Source
Thrown at arthas-mcp-server/src/main/java/com/taobao/arthas/mcp/server/util/JsonParser.java:178
else if (javaType == Long.class) {
BigDecimal bigDecimal = new BigDecimal(value.toString());
return bigDecimal.longValueExact();
}
else if (javaType == Double.class) {
return Double.parseDouble(value.toString());
}
else if (javaType == Float.class) {
return Float.parseFloat(value.toString());
}
else if (javaType == Boolean.class) {
return Boolean.parseBoolean(value.toString());
}
else if (javaType == Character.class) {
String s = value.toString();
if (s.length() == 1) {
return s.charAt(0);
}
throw new IllegalArgumentException("Cannot convert to char: " + value);
}
else if (javaType.isEnum()) {
@SuppressWarnings("unchecked")
Class<Enum> enumType = (Class<Enum>) javaType;
return Enum.valueOf(enumType, value.toString());
}
String json = JsonParser.toJson(value);
return JsonParser.fromJson(json, javaType);
}
public static Class<?> resolvePrimitiveIfNecessary(Class<?> type) {
if (type.isPrimitive()) {
return Utils.getWrapperClassForPrimitive(type);
}
return type;
}View on GitHub (pinned to 21cf2e9ba5)
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.
Example fix
// before
char c = (char) JsonParser.convertValue(raw, Character.class); // raw = "ab" -> throws
// after
String s = String.valueOf(raw);
if (s.length() != 1) throw new IllegalArgumentException("expected single char, got: " + s);
char c = s.charAt(0); Defensive patterns
Strategy: validation
Validate before calling
String s = value == null ? "" : value.toString();
if (targetType == Character.class || targetType == char.class) {
if (s.length() != 1) throw new IllegalArgumentException("expected single char, got: " + s);
} Type guard
static boolean isSingleChar(Object v) {
return v != null && v.toString().length() == 1;
} Try / catch
try {
return JsonParser.convertValue(raw, Character.class);
} catch (IllegalArgumentException e) {
if (e.getMessage().startsWith("Cannot convert to char")) {
return null; // or a default char
}
throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Conversion from JSON to {type} failed
- {iface} missing newInstance method
- {iface} is not an interface
- expecting exactly 1 method in {iface}
- parse request failed: request body is empty
AI-assisted analysis of alibaba/arthas@21cf2e9ba5 (2026-08-14).
Data as JSON: /api/errors/3e3cf6eeb2379cfb.
Report an issue: GitHub.