{"record":{"id":"e61fc8df0192ce66","repo":"skylot/jadx","slug":"unexpected-inner-type-found","errorCode":null,"errorMessage":"Unexpected inner type found: {}","messagePattern":"Unexpected 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":242,"sourceCode":"\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 {\n\t\t\tif (lookAhead('*')) {\n\t\t\t\tnext();\n\t\t\t\ttype = ArgType.wildcard();\n\t\t\t} else if (lookAhead('+')) {\n\t\t\t\tnext();\n\t\t\t\ttype = ArgType.wildcard(consumeType(), ArgType.WildcardBound.EXTENDS);\n\t\t\t} else if (lookAhead('-')) {\n\t\t\t\tnext();\n\t\t\t\ttype = ArgType.wildcard(consumeType(), ArgType.WildcardBound.SUPER);","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java#L224-L260","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    javaClass.decompile();\n} catch (JadxRuntimeException e) {\n    LOG.warn(\"Deep inner-type parse failed in {}: {}\", javaClass.getName(), e.getMessage());\n}","preventionTips":["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."],"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"}