skylot/jadx · error · JadxRuntimeException
No base methods for override attribute: {}
Error message
No base methods for override attribute: {} What it means
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.
Source
Thrown at jadx-core/src/main/java/jadx/core/dex/visitors/OverrideMethodVisitor.java:67
@Override
public boolean visit(ClassNode cls) throws JadxException {
SuperTypesData superData = collectSuperTypes(cls);
if (superData != null) {
for (MethodNode mth : cls.getMethods()) {
processMth(mth, superData);
}
}
return true;
}
private void processMth(MethodNode mth, SuperTypesData superData) {
if (mth.isConstructor() || mth.getAccessFlags().isStatic() || mth.getAccessFlags().isPrivate()) {
return;
}
MethodOverrideAttr attr = processOverrideMethods(mth, superData);
if (attr != null) {
if (attr.getBaseMethods().isEmpty()) {
throw new JadxRuntimeException("No base methods for override attribute: " + attr.getOverrideList());
}
mth.addAttr(attr);
IMethodDetails baseMth = Utils.getOne(attr.getBaseMethods());
if (baseMth != null) {
boolean updated = fixMethodReturnType(mth, baseMth, superData);
updated |= fixMethodArgTypes(mth, baseMth, superData);
if (updated) {
// check if new signature cause method collisions
checkMethodSignatureCollisions(mth, mth.root().getArgs().isRenameValid());
}
}
}
}
private MethodOverrideAttr processOverrideMethods(MethodNode mth, SuperTypesData superData) {
MethodOverrideAttr result = mth.get(AType.METHOD_OVERRIDE);
if (result != null) {
return result;View on GitHub (pinned to e738a26571)
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.
Defensive patterns
Strategy: try-catch
Try / catch
try {
javaClass.decompile();
} catch (JadxRuntimeException e) {
LOG.warn("Override attribute invariant violated in {}: {}", javaClass.getName(), e.getMessage());
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Bad name for type variable: {}
- No inner type found: {}
- Unexpected inner type found: {}
- Failed to parse generic types map
- Unexpected end of signature
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/c9d711b440efe30c.
Report an issue: GitHub.