{"record":{"id":"0df09ae2ee6266b5","repo":"Blankj/AndroidUtilCode","slug":"presenterclass-is-null","errorCode":null,"errorMessage":"presenterClass is null!","messagePattern":"presenterClass is null!","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"lib/base/src/main/java/com/blankj/base/mvp/BaseView.java","lineNumber":76,"sourceCode":"    public <T extends Fragment> T getFragment() {\n        if (mFragment == null) {\n            return null;\n        }\n        //noinspection unchecked\n        return (T) mFragment;\n    }\n\n    public V addPresenter(BasePresenter<V> presenter) {\n        if (presenter == null) return (V) this;\n        mPresenterMap.put(presenter.getClass(), presenter);\n        //noinspection unchecked\n        presenter.bindView((V) this);\n        return (V) this;\n    }\n\n    public <P extends BasePresenter<V>> P getPresenter(Class<P> presenterClass) {\n        if (presenterClass == null) {\n            throw new IllegalArgumentException(\"presenterClass is null!\");\n        }\n        BasePresenter<V> basePresenter = mPresenterMap.get(presenterClass);\n        if (basePresenter == null) {\n            throw new IllegalArgumentException(\"presenter of <\" + presenterClass.getSimpleName() + \"> is not added!\");\n        }\n        //noinspection unchecked\n        return (P) basePresenter;\n    }\n\n    @CallSuper\n    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n    public void onDestroy() {\n        Log.i(TAG, \"destroy view: \" + getClass().getSimpleName());\n        removeLifecycle(this);\n        for (BasePresenter<V> presenter : mPresenterMap.values()) {\n            if (presenter != null) {\n                presenter.onDestroy();\n            }","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/Blankj/AndroidUtilCode/blob/7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java#L58-L94","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Pass the concrete presenter class literal, e.g. getPresenter(LoginPresenter.class), never a possibly-null variable.","Initialise any Class field you intend to pass before the getPresenter call, or assert it is non-null.","If the presenter class is optional, branch on the field being null instead of calling getPresenter(null)."],"exampleFix":"// before\nClass<? extends BasePresenter<V>> cls = null;\ngetPresenter(cls); // throws\n\n// after\ngetPresenter(LoginPresenter.class);","handlingStrategy":"validation","validationCode":"if (presenterClass != null) {\n    getPresenter(presenterClass);\n}","typeGuard":"private static boolean isPresenterClassKnown(Class<?> c) {\n    return c != null && BasePresenter.class.isAssignableFrom(c);\n}","tryCatchPattern":null,"preventionTips":["Pass concrete class literals (XPresenter.class), never nullable variables.","Initialise any Class field before using it as a getPresenter key.","Branch on null instead of forwarding it to getPresenter."],"tags":["android","mvp","null-argument","contract"],"backgroundTag":null,"analyzedSha":"7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809","analyzedAt":"2026-08-14T02:26:54.956Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}