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
- Inspect getCause() on the thrown JadxRuntimeException to find the specific visitor pass that failed.
- If this is a programmatic workflow, skip the failing class and continue with others rather than aborting the whole batch.
- Try the class with a reduced set of passes or a different decompilation mode if the API path supports it.
- 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
- Wrap forceProcess calls in try-catch when batch-processing to avoid aborting on a single class.
- Log the cause exception, not just the wrapper, to identify the failing visitor pass.
- Prefer generateCode (with dependency handling) over forceProcess for normal workflows — forceProcess is for advanced use.
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
- Failed to generate code for class: ${cls.getFullName()}
- Failed to process method to visitor:
- Duplicate class:
- Missing class:
- Bad name for type variable: {}
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/149d082c437024b2.
Report an issue: GitHub.