{"record":{"id":"4562aa1ec9b6791b","repo":"skylot/jadx","slug":"no-inner-type-found","errorCode":null,"errorMessage":"No inner type found: {}","messagePattern":"No inner type found: (.+?)","errorType":"exception","errorClass":"JadxRuntimeException","httpStatus":null,"severity":"error","filePath":"jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java","lineNumber":233,"sourceCode":"\t\tif (!innerType) {\n\t\t\tobj += ';';\n\t\t} else {\n\t\t\tobj = obj.replace('/', '.');\n\t\t}\n\t\tList<ArgType> typeVars = consumeGenericArgs();\n\t\tconsume('>');\n\n\t\tArgType genericType = ArgType.generic(obj, typeVars);\n\t\tif (!lookAhead('.')) {\n\t\t\tconsume(';');\n\t\t\treturn genericType;\n\t\t}\n\t\tconsume('.');\n\t\tnext();\n\t\t// type parsing not completed, proceed to inner class\n\t\tArgType inner = consumeObjectType(true);\n\t\tif (inner == null) {\n\t\t\tthrow new JadxRuntimeException(\"No inner type found: \" + debugString());\n\t\t}\n\t\t// for every nested inner type create nested type object\n\t\twhile (lookAhead('.')) {\n\t\t\tgenericType = ArgType.outerGeneric(genericType, inner);\n\t\t\tconsume('.');\n\t\t\tnext();\n\t\t\tinner = consumeObjectType(true);\n\t\t\tif (inner == null) {\n\t\t\t\tthrow new JadxRuntimeException(\"Unexpected inner type found: \" + debugString());\n\t\t\t}\n\t\t}\n\t\treturn ArgType.outerGeneric(genericType, inner);\n\t}\n\n\tprivate List<ArgType> consumeGenericArgs() {\n\t\tList<ArgType> list = new ArrayList<>();\n\t\tArgType type;\n\t\tdo {","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java#L215-L251","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    javaClass.decompile();\n} catch (JadxRuntimeException e) {\n    LOG.warn(\"Inner-type parse failed in {}: {}\", javaClass.getName(), e.getMessage());\n}","preventionTips":["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."],"tags":["jadx","decompiler","signature-parser","inner-class","generics","obfuscation"],"backgroundTag":null,"analyzedSha":"e738a26571d02919f01df40de93bc9a44dee4e18","analyzedAt":"2026-08-14T00:10:24.238Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}