skylot/jadx · error · JadxRuntimeException
Unexpected inner type found: {}
Error message
Unexpected inner type found: {} What it means
Thrown in the same inner-class parsing loop as error 122, but on a subsequent iteration. After successfully parsing at least one inner type, the loop encounters another '.' (lookAhead('.') is true), consumes it, and consumeObjectType(true) returns null. This indicates a multi-level inner-class chain (Outer.Mid.Inner) where one of the later links is missing or malformed.
Source
Thrown at jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java:242
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 {
if (lookAhead('*')) {
next();
type = ArgType.wildcard();
} else if (lookAhead('+')) {
next();
type = ArgType.wildcard(consumeType(), ArgType.WildcardBound.EXTENDS);
} else if (lookAhead('-')) {
next();
type = ArgType.wildcard(consumeType(), ArgType.WildcardBound.SUPER);View on GitHub (pinned to e738a26571)
Solutions
- Upgrade jadx — inner-class signature handling improves across releases.
- Wrap decompilation in try-catch for JadxRuntimeException and skip the class.
- Report with the signature debug string from the error message.
- Remove the Signature attribute from the affected class before decompiling.
Defensive patterns
Strategy: try-catch
Try / catch
try {
javaClass.decompile();
} catch (JadxRuntimeException e) {
LOG.warn("Deep inner-type parse failed in {}: {}", javaClass.getName(), e.getMessage());
} Prevention
- Upgrade jadx for multi-level inner-class signature support.
- Wrap each class decompilation in try-catch.
- Report deeply-nested inner-class signature issues with full context.
- Strip Signature attributes from problematic classes as a temporary fix.
When it happens
Trigger: Inside the while(lookAhead('.')) loop in consumeObjectType: genericType and inner are already populated from a prior iteration, another '.' is consumed, next() is called, but consumeObjectType(true) returns null (signature ended prematurely on a deeper nesting level).
Common situations: Deeply nested inner classes with corrupted signature attributes, typically from aggressive obfuscation or broken bytecode merging. The pattern Outer<T>.Mid.Inner where the signature is truncated after a second dot.
Related errors
- No 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/e61fc8df0192ce66.
Report an issue: GitHub.