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

  1. Upgrade jadx — override-detection logic is regularly refined for complex hierarchies.
  2. Catch JadxRuntimeException per class and continue with remaining classes.
  3. Report the issue with the override list from the error message and the class hierarchy.
  4. 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

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


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