skylot/jadx · error · JadxRuntimeException

Failed to process class: ${cls.getFullName()}

Error message

Failed to process class: ${cls.getFullName()}

What it means

Thrown by ProcessClass.forceProcess when an exception or StackOverflowError occurs during class processing (running visitor passes) without generating code. forceProcess is used to load and run passes on a class directly, bypassing dependency resolution. Jadx wraps the cause in a JadxRuntimeException with the class's full name.

Source

Thrown at jadx-core/src/main/java/jadx/core/ProcessClass.java:149

			return code;
		} catch (StackOverflowError | Exception e) {
			throw new JadxRuntimeException("Failed to generate code for class: " + cls.getFullName(), e);
		}
	}

	/**
	 * Load and process class without its deps
	 */
	public void forceProcess(ClassNode cls) {
		ClassNode topParentClass = cls.getTopParentClass();
		if (topParentClass != cls) {
			forceProcess(topParentClass);
			return;
		}
		try {
			process(cls, false);
		} catch (StackOverflowError | Exception e) {
			throw new JadxRuntimeException("Failed to process class: " + cls.getFullName(), e);
		}
	}

	/**
	 * Generate code for class without processing its deps
	 */
	public @Nullable ICodeInfo forceGenerateCode(ClassNode cls) {
		try {
			return process(cls, true);
		} catch (StackOverflowError | Exception e) {
			throw new JadxRuntimeException("Failed to generate code for class: " + cls.getFullName(), e);
		}
	}

	private final Map<DecompilationMode, ProcessClass> modesMap = new EnumMap<>(DecompilationMode.class);

	public @Nullable ICodeInfo forceGenerateCodeForMode(ClassNode cls, DecompilationMode mode) {
		synchronized (modesMap) {

View on GitHub (pinned to e738a26571)

Solutions

  1. Inspect getCause() on the thrown JadxRuntimeException to find the specific visitor pass that failed.
  2. If this is a programmatic workflow, skip the failing class and continue with others rather than aborting the whole batch.
  3. Try the class with a reduced set of passes or a different decompilation mode if the API path supports it.
  4. Report the class and cause as a jadx issue if it reproduces on the latest version.
Defensive patterns

Strategy: try-catch

Try / catch

try {
    processClass.forceProcess(cls);
} catch (JadxRuntimeException e) {
    LOG.warn("Failed to process class {}: {}", cls.getFullName(), e.getCause().getMessage());
    // skip this class, continue with others
}

Prevention

When it happens

Trigger: Calling forceProcess(cls) where processing the top-parent class through its visitor passes throws. The method first delegates to the top-parent class via getTopParentClass(), then runs process(cls, false). Any exception during pass execution (DepthTraversal.visit) is caught and rewrapped. Typical causes are bytecode-level issues in specific passes or StackOverflowError.

Common situations: Programmatic API usage that pre-processes classes before code generation. Internal jadx operations that need a class loaded but not decompiled. Obfuscated inputs that trigger bugs in earlier visitor passes (before code generation is reached).

Related errors


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