skylot/jadx · error · IllegalArgumentException
Null option descriptions in plugin id: {}
Error message
Null option descriptions in plugin id: {} What it means
Thrown as IllegalArgumentException by JadxPluginManager.verifyOptions() when a plugin's JadxPluginOptions.getOptionsDescriptions() returns null. Every plugin that declares options must return a non-null (possibly empty) list of OptionDescription. A null return is treated as a plugin contract violation because the manager needs to iterate descriptions to validate option naming, descriptions, and values.
Source
Thrown at jadx-core/src/main/java/jadx/core/plugins/JadxPluginManager.java:191
context.unload();
} catch (Exception e) {
LOG.warn("Failed to unload plugin: {}", context.getPluginId(), e);
}
}
}
private AppContext buildDefaultAppContext() {
AppContext appContext = new AppContext();
appContext.setGuiContext(null);
appContext.setFilesGetter(decompiler.getArgs().getFilesGetter());
return appContext;
}
private void verifyOptions(PluginContext pluginContext, JadxPluginOptions options) {
String pluginId = pluginContext.getPluginId();
List<OptionDescription> descriptions = options.getOptionsDescriptions();
if (descriptions == null) {
throw new IllegalArgumentException("Null option descriptions in plugin id: " + pluginId);
}
String prefix = pluginId + '.';
descriptions.forEach(descObj -> {
String optName = descObj.name();
if (optName == null || !optName.startsWith(prefix)) {
throw new IllegalArgumentException("Plugin option name should start with plugin id: '" + prefix + "', option: " + optName);
}
String desc = descObj.description();
if (desc == null || desc.isEmpty()) {
throw new IllegalArgumentException("Plugin option description not set, plugin: " + pluginId);
}
List<String> values = descObj.values();
if (values == null) {
throw new IllegalArgumentException("Plugin option values is null, option: " + optName + ", plugin: " + pluginId);
}
});
}
View on GitHub (pinned to e738a26571)
Solutions
- If you are the plugin author: return Collections.emptyList() instead of null from getOptionsDescriptions().
- If you are the plugin user: report the bug to the plugin author, or disable the plugin via the disabled-plugins list.
- Update the plugin to a version that returns an empty list for no-option plugins.
Example fix
// before
@Override
public List<OptionDescription> getOptionsDescriptions() {
return null; // triggers error
}
// after
@Override
public List<OptionDescription> getOptionsDescriptions() {
return Collections.emptyList();
} Defensive patterns
Strategy: validation
Validate before calling
// In your JadxPluginOptions implementation
@Override
public List<OptionDescription> getOptionsDescriptions() {
// Return empty list instead of null when there are no options
return Collections.emptyList();
} Prevention
- Plugin authors: always return a non-null list from getOptionsDescriptions(), even if empty.
- Add a unit test that calls getOptionsDescriptions() and asserts non-null.
- Plugin users: disable broken plugins via the disabled-plugins configuration.
When it happens
Trigger: A plugin's init() calls context.init() with a JadxPluginOptions whose getOptionsDescriptions() returns null. This occurs during plugin initialization (after initAll/initResolved), when the manager validates all option metadata.
Common situations: Third-party or custom jadx plugin that implements JadxPluginOptions but returns null from getOptionsDescriptions() instead of an empty list. Often a developer oversight when the plugin has no options to declare.
Related errors
- Plugin option description not set, plugin: {}
- Plugin option values is null, option: {}, plugin: {}
- Plugin option name should start with plugin id: '{}', option
- Duplicate plugin id: {}, class {}
- Null arg type in {} at: {} in: {}
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/0f105f45291d7e09.
Report an issue: GitHub.