Blankj/AndroidUtilCode · error · IllegalArgumentException

presenterClass is null!

Error message

presenterClass is null!

What it means

BaseView.getPresenter(Class) throws IllegalArgumentException when the requested presenter class argument is null. It is a contract check: a null class key cannot be looked up in the presenter map, so the call is rejected before any map access.

Solutions

  1. Pass the concrete presenter class literal, e.g. getPresenter(LoginPresenter.class), never a possibly-null variable.
  2. Initialise any Class field you intend to pass before the getPresenter call, or assert it is non-null.
  3. If the presenter class is optional, branch on the field being null instead of calling getPresenter(null).

Example fix

// before
Class<? extends BasePresenter<V>> cls = null;
getPresenter(cls); // throws

// after
getPresenter(LoginPresenter.class);
Defensive patterns

Strategy: validation

Validate before calling

if (presenterClass != null) {
    getPresenter(presenterClass);
}

Type guard

private static boolean isPresenterClassKnown(Class<?> c) {
    return c != null && BasePresenter.class.isAssignableFrom(c);
}

Prevention

When it happens

Trigger: Calling getPresenter(null), or getPresenter(someField) where someField is a Class reference that has not been initialised (still null), e.g. a presenter class loaded lazily or conditionally.

Common situations: A field holding the presenter Class is left null due to a missed initialisation; passing a Class obtained from a dynamic lookup that returned null; copy-paste leaving a placeholder null in a getPresenter call.

Related errors


AI-assisted analysis of Blankj/AndroidUtilCode@7b4caf9e54 (2026-08-14). Data as JSON: /api/errors/0df09ae2ee6266b5. Report an issue: GitHub.

Appendix: source

Thrown at lib/base/src/main/java/com/blankj/base/mvp/BaseView.java:76

    public <T extends Fragment> T getFragment() {
        if (mFragment == null) {
            return null;
        }
        //noinspection unchecked
        return (T) mFragment;
    }

    public V addPresenter(BasePresenter<V> presenter) {
        if (presenter == null) return (V) this;
        mPresenterMap.put(presenter.getClass(), presenter);
        //noinspection unchecked
        presenter.bindView((V) this);
        return (V) this;
    }

    public <P extends BasePresenter<V>> P getPresenter(Class<P> presenterClass) {
        if (presenterClass == null) {
            throw new IllegalArgumentException("presenterClass is null!");
        }
        BasePresenter<V> basePresenter = mPresenterMap.get(presenterClass);
        if (basePresenter == null) {
            throw new IllegalArgumentException("presenter of <" + presenterClass.getSimpleName() + "> is not added!");
        }
        //noinspection unchecked
        return (P) basePresenter;
    }

    @CallSuper
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.i(TAG, "destroy view: " + getClass().getSimpleName());
        removeLifecycle(this);
        for (BasePresenter<V> presenter : mPresenterMap.values()) {
            if (presenter != null) {
                presenter.onDestroy();
            }

View on GitHub (pinned to 7b4caf9e54)