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

  1. If you are the plugin author: return Collections.emptyList() instead of null from getOptionsDescriptions().
  2. If you are the plugin user: report the bug to the plugin author, or disable the plugin via the disabled-plugins list.
  3. 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

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


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