{"record":{"id":"c9d711b440efe30c","repo":"skylot/jadx","slug":"no-base-methods-for-override-attribute","errorCode":null,"errorMessage":"No base methods for override attribute: {}","messagePattern":"No base methods for override attribute: (.+?)","errorType":"exception","errorClass":"JadxRuntimeException","httpStatus":null,"severity":"error","filePath":"jadx-core/src/main/java/jadx/core/dex/visitors/OverrideMethodVisitor.java","lineNumber":67,"sourceCode":"\t@Override\n\tpublic boolean visit(ClassNode cls) throws JadxException {\n\t\tSuperTypesData superData = collectSuperTypes(cls);\n\t\tif (superData != null) {\n\t\t\tfor (MethodNode mth : cls.getMethods()) {\n\t\t\t\tprocessMth(mth, superData);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate void processMth(MethodNode mth, SuperTypesData superData) {\n\t\tif (mth.isConstructor() || mth.getAccessFlags().isStatic() || mth.getAccessFlags().isPrivate()) {\n\t\t\treturn;\n\t\t}\n\t\tMethodOverrideAttr attr = processOverrideMethods(mth, superData);\n\t\tif (attr != null) {\n\t\t\tif (attr.getBaseMethods().isEmpty()) {\n\t\t\t\tthrow new JadxRuntimeException(\"No base methods for override attribute: \" + attr.getOverrideList());\n\t\t\t}\n\t\t\tmth.addAttr(attr);\n\t\t\tIMethodDetails baseMth = Utils.getOne(attr.getBaseMethods());\n\t\t\tif (baseMth != null) {\n\t\t\t\tboolean updated = fixMethodReturnType(mth, baseMth, superData);\n\t\t\t\tupdated |= fixMethodArgTypes(mth, baseMth, superData);\n\t\t\t\tif (updated) {\n\t\t\t\t\t// check if new signature cause method collisions\n\t\t\t\t\tcheckMethodSignatureCollisions(mth, mth.root().getArgs().isRenameValid());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate MethodOverrideAttr processOverrideMethods(MethodNode mth, SuperTypesData superData) {\n\t\tMethodOverrideAttr result = mth.get(AType.METHOD_OVERRIDE);\n\t\tif (result != null) {\n\t\t\treturn result;","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/dex/visitors/OverrideMethodVisitor.java#L49-L85","documentation":"Thrown by OverrideMethodVisitor.processMth() when a MethodOverrideAttr was successfully built (processOverrideMethods returned non-null) but its baseMethods set is empty. The override attribute records which super/interface methods a method overrides; an empty base set with a non-null attribute is an invariant violation — the attribute should not exist without at least one base method.","triggerScenarios":"processOverrideMethods(mth, superData) returns a MethodOverrideAttr with a populated overrideList but an empty baseMethods set. This means override candidates were found in the override list but none qualified as base methods — a logic inconsistency in the override-detection algorithm.","commonSituations":"Classes with complex inheritance hierarchies (multiple interfaces, deep generics, bridge methods) where override detection finds candidates but cannot resolve concrete base methods. Often seen with obfuscated class hierarchies or with classes generated by Kotlin/Scala compilers that produce unusual method structures.","solutions":["Upgrade jadx — override-detection logic is regularly refined for complex hierarchies.","Catch JadxRuntimeException per class and continue with remaining classes.","Report the issue with the override list from the error message and the class hierarchy.","Try disabling rename/validation passes that depend on override attributes."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    javaClass.decompile();\n} catch (JadxRuntimeException e) {\n    LOG.warn(\"Override attribute invariant violated in {}: {}\", javaClass.getName(), e.getMessage());\n}","preventionTips":["Upgrade jadx — override-detection logic is refined for complex hierarchies.","Isolate per-class with try-catch.","Report the override list and class hierarchy from the error message.","Try disabling rename/validation passes that depend on override attributes."],"tags":["jadx","decompiler","method-override","inheritance","invariant","generics"],"backgroundTag":null,"analyzedSha":"e738a26571d02919f01df40de93bc9a44dee4e18","analyzedAt":"2026-08-14T00:10:24.238Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}