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

  1. Upgrade jadx — inner-class signature handling improves across releases.
  2. Wrap decompilation in try-catch for JadxRuntimeException and skip the class.
  3. Report with the signature debug string from the error message.
  4. 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

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


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