skylot/jadx · error · IllegalArgumentException

Plugin option description not set, plugin: {}

Error message

Plugin option description not set, plugin: {}

What it means

Thrown as IllegalArgumentException by JadxPluginManager.verifyOptions() when an OptionDescription.description() returns null or an empty string. Every plugin option must have a human-readable description for CLI help output and GUI tooltips. A missing description is a plugin contract violation.

Source

Thrown at jadx-core/src/main/java/jadx/core/plugins/JadxPluginManager.java:201

		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);
			}
		});
	}

	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

View on GitHub (pinned to e738a26571)

Solutions

  1. Provide a non-empty, meaningful description string for every option in your OptionDescription implementation.
  2. If using a builder pattern for options, add a null/empty check in the builder's build() method.
  3. If you are not the plugin author, report the issue or disable the plugin.

Example fix

// before
new OptionDescription() {
    public String description() { return null; }
    ...
}

// after
new OptionDescription() {
    public String description() { return "Output directory for exported files"; }
    ...
}
Defensive patterns

Strategy: validation

Validate before calling

// In your OptionDescription implementation
@Override
public String description() {
    String desc = buildDescription(); // your logic
    if (desc == null || desc.isEmpty()) {
        throw new IllegalStateException("Description must not be null/empty for option: " + name());
    }
    return desc;
}

Prevention

When it happens

Trigger: A plugin's OptionDescription.description() returns null or "". The manager checks each option description during initialization, after all plugins have been init'd.

Common situations: Custom jadx plugin where the author forgot to populate the description field, or a dynamically-constructed OptionDescription where the description was left null by a builder.

Related errors


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