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

  1. Ensure the source value is exactly one character when the target type is char/Character.
  2. Change the target parameter type to String if multi-character input is legitimate.
  3. 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

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


AI-assisted analysis of alibaba/arthas@21cf2e9ba5 (2026-08-14). Data as JSON: /api/errors/3e3cf6eeb2379cfb. Report an issue: GitHub.