skylot/jadx · error · JadxRuntimeException

Can't parse type: {}, unexpected: {}

Error message

Can't parse type: {}, unexpected: {}

What it means

Thrown by SignatureParser.consumeType() when the current character is not a recognised signature start token — not 'L' (object), 'T' (type variable), '[' (array), STOP_CHAR (end), or a single-char primitive (BCDFIJSZV). This means the signature string contains an unexpected character at a position where a type is required, indicating a corrupt or malformed Signature attribute.

Source

Thrown at jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java:169

					return ArgType.genericType(typeVarName);
				}
				break;

			case '[':
				return ArgType.array(consumeType());

			case STOP_CHAR:
				return null;

			default:
				// primitive type (one char)
				ArgType type = ArgType.parse(ch);
				if (type != null) {
					return type;
				}
				break;
		}
		throw new JadxRuntimeException("Can't parse type: " + debugString() + ", unexpected: " + ch);
	}

	public List<ArgType> consumeTypeList() {
		List<ArgType> list = null;
		while (true) {
			ArgType type = consumeType();
			if (type == null) {
				break;
			}
			if (list == null) {
				list = new ArrayList<>();
			}
			list.add(type);
		}
		if (list == null) {
			return Collections.emptyList();
		}
		return list;

View on GitHub (pinned to e738a26571)

Solutions

  1. Upgrade jadx — the parser is continuously hardened against unusual signatures.
  2. Wrap per-class decompilation in try-catch for JadxRuntimeException and continue with remaining classes.
  3. Report the issue with the full debug string from the error message (it includes the signature and the failing position).
  4. Remove the malformed Signature attribute from the offending class using ASM before feeding the file to jadx.

Example fix

// before
String code = javaClass.getCode();

// after
try {
    String code = javaClass.getCode();
} catch (JadxRuntimeException e) {
    LOG.warn("Signature parse failed for {}: {}", javaClass.getName(), e.getMessage());
}
Defensive patterns

Strategy: try-catch

Try / catch

try {
    String code = javaClass.getCode();
} catch (JadxRuntimeException e) {
    LOG.warn("Type parse failed in {}: {}", javaClass.getName(), e.getMessage());
    // fall back to raw bytecode / smali for this class
}

Prevention

When it happens

Trigger: consumeType() is called (directly or via consumeTypeList / consumeMethodArgs / consumeExtendsTypesList), the switch falls through the default branch, ArgType.parse(ch) returns null for the char, and execution reaches the final throw. The char is something like '@', '(', or a letter that is not a valid primitive code.

Common situations: Malformed Signature attributes from obfuscators or bytecode manipulators that emit non-standard signatures. Can also occur if jadx's caller passes a raw descriptor where a full signature is expected, or if a DEX merger concatenated signature strings incorrectly.

Related errors


AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14). Data as JSON: /api/errors/acaa7eba64b230d8. Report an issue: GitHub.