skylot/jadx · error · IllegalArgumentException
Plugin option values is null, option: {}, plugin: {}
Error message
Plugin option values is null, option: {}, plugin: {} What it means
Thrown as IllegalArgumentException by JadxPluginManager.verifyOptions() when an OptionDescription.values() returns null. The values() method returns the list of accepted values for an option (used for validation and GUI dropdowns). A null return is a contract violation — even options with unrestricted values should return an empty list, not null.
Source
Thrown at jadx-core/src/main/java/jadx/core/plugins/JadxPluginManager.java:205
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);
}
});
}
public List<JadxCodeInput> getCodeInputs() {
return getResolvedPluginContexts()
.stream()
.flatMap(p -> p.getCodeInputs().stream())
.collect(Collectors.toList());
}
public void registerAddPluginListener(Consumer<PluginContext> listener) {
this.addPluginListeners.add(listener);
// run for already added plugins
getAllPluginContexts().forEach(listener);
}
}
View on GitHub (pinned to e738a26571)
Solutions
- Return Collections.emptyList() (or a list of accepted values) from values() instead of null.
- If you are not the plugin author, report the bug or disable the plugin via the disabled-plugins list.
Example fix
// before
new OptionDescription() {
public List<String> values() { return null; }
...
}
// after
new OptionDescription() {
public List<String> values() { return Collections.emptyList(); }
...
} Defensive patterns
Strategy: validation
Validate before calling
// In your OptionDescription implementation
@Override
public List<String> values() {
// Return empty list for unrestricted options, never null
return acceptedValues != null ? acceptedValues : Collections.emptyList();
} Prevention
- Plugin authors: return Collections.emptyList() instead of null from values().
- Add a unit test asserting values() returns non-null for all options.
- Plugin users: disable broken plugins via the disabled-plugins list.
When it happens
Trigger: A plugin's OptionDescription.values() returns null. The manager checks this for every option description after plugin initialization. Options that accept any value should return Collections.emptyList() rather than null.
Common situations: Custom jadx plugin development where the author returns null from values() for free-form string options, not realizing the manager requires a non-null list.
Related errors
- Null option descriptions in plugin id: {}
- Plugin option description not set, 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/f2208268517a331d.
Report an issue: GitHub.