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
- Upgrade jadx — the parser is continuously hardened against unusual signatures.
- Wrap per-class decompilation in try-catch for JadxRuntimeException and continue with remaining classes.
- Report the issue with the full debug string from the error message (it includes the signature and the failing position).
- 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
- Upgrade jadx regularly for parser improvements.
- Decompile per-class with try-catch to isolate failures.
- Avoid feeding hand-edited or re-serialized DEX files; use original compiler output when possible.
- File bug reports with the exact signature string from the error message.
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
- Bad name for type variable: {}
- No inner type found: {}
- Unexpected inner type found: {}
- Failed to parse generic types map
- Unexpected end of signature
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/acaa7eba64b230d8.
Report an issue: GitHub.