skylot/jadx · error · JadxRuntimeException
No inner type found: {}
Error message
No inner type found: {} What it means
Thrown when parsing a parameterised outer/inner type chain (e.g. 'Lcom/Foo<TT;>.Bar<...>;'). After consuming the '.' separator that introduces an inner class, consumeObjectType(true) returns null — meaning the signature ended (STOP_CHAR) where an inner type name was expected. The signature is truncated or malformed at the inner-class boundary.
Source
Thrown at jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java:233
if (!innerType) {
obj += ';';
} else {
obj = obj.replace('/', '.');
}
List<ArgType> typeVars = consumeGenericArgs();
consume('>');
ArgType genericType = ArgType.generic(obj, typeVars);
if (!lookAhead('.')) {
consume(';');
return genericType;
}
consume('.');
next();
// type parsing not completed, proceed to inner class
ArgType inner = consumeObjectType(true);
if (inner == null) {
throw new JadxRuntimeException("No inner type found: " + debugString());
}
// for every nested inner type create nested type object
while (lookAhead('.')) {
genericType = ArgType.outerGeneric(genericType, inner);
consume('.');
next();
inner = consumeObjectType(true);
if (inner == null) {
throw new JadxRuntimeException("Unexpected inner type found: " + debugString());
}
}
return ArgType.outerGeneric(genericType, inner);
}
private List<ArgType> consumeGenericArgs() {
List<ArgType> list = new ArrayList<>();
ArgType type;
do {View on GitHub (pinned to e738a26571)
Solutions
- Upgrade jadx to benefit from ongoing signature-parser hardening.
- Catch JadxRuntimeException per class and skip the failing one.
- File a jadx issue with the signature snippet from the error (debugString() shows the full signature and position).
- Strip the offending Signature attribute via a bytecode tool before decompiling.
Defensive patterns
Strategy: try-catch
Try / catch
try {
javaClass.decompile();
} catch (JadxRuntimeException e) {
LOG.warn("Inner-type parse failed in {}: {}", javaClass.getName(), e.getMessage());
} Prevention
- Keep jadx up to date for inner-class signature handling.
- Isolate per-class decompilation with try-catch.
- Preserve original input files for bug reports.
- If only a few classes fail, strip their Signature attributes as a workaround.
When it happens
Trigger: consumeObjectType(false) parses 'Lcom/Foo<TT;>', sees lookAhead('.') is true, consumes '.', calls next(), then consumeObjectType(true) hits STOP_CHAR immediately and returns null. This occurs when a signature like 'Lcom/Foo<TT;>.' has no inner class name after the dot.
Common situations: Obfuscated or corrupted Signature attributes referencing inner classes with mangled names. Also seen when DEX shrinking/rewriting tools truncate signature strings that contain inner-class dotted notation.
Related errors
- Unexpected inner type found: {}
- Bad name for type variable: {}
- Failed to parse generic types map
- Unexpected end of signature
- Can't parse type: {}, unexpected: {}
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/4562aa1ec9b6791b.
Report an issue: GitHub.