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

  1. Upgrade jadx to benefit from ongoing signature-parser hardening.
  2. Catch JadxRuntimeException per class and skip the failing one.
  3. File a jadx issue with the signature snippet from the error (debugString() shows the full signature and position).
  4. 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

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


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