继承BaseActivity时调用super.onCreate触发空指针异常求助
咱们先拆解最关键的错误信息,直接定位问题根源:
java.lang.RuntimeException: 无法启动活动ComponentInfo{ com.abc.xyx/com.abc.xyx.actvities.SplashScreenActivity}: java.lang.NullPointerException: 尝试对空对象引用调用虚拟方法'void com.abc.xyx.DMCApplication.addActivity(android.app.Activity)'
这个空指针的核心原因很明确:调用super.onCreate()时,DMCApplication的实例还没被正确初始化,导致调用addActivity()方法时拿到的是null对象。下面给出针对性的排查和解决步骤:
1. 检查AndroidManifest.xml的Application配置
首先要确保你已经在Manifest中正确声明了自定义的DMCApplication类,否则系统会默认使用Application基类,自然拿不到你的自定义实现实例。
正确的配置格式如下:
<application android:name=".DMCApplication" <!-- 必须添加这一行,指定自定义Application --> android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" ...> <!-- 你的SplashScreenActivity等页面声明 --> </application>
2. 修正BaseActivity中获取DMCApplication实例的方式
很多人会踩的坑是在Activity构造方法或者onCreate之前的阶段获取Application实例,这时候Activity还没和Application建立关联,getApplication()会返回null。
正确的做法是在super.onCreate()之后(或就在onCreate方法内),通过getApplication()获取实例:
public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 正确获取自定义Application实例 DMCApplication appInstance = (DMCApplication) getApplication(); // 加个非空判断,进一步避免空指针风险 if (appInstance != null) { appInstance.addActivity(this); } } }
3. 确认DMCApplication的基础实现正确
最后检查你的DMCApplication类,确保它正确继承自Application,并且addActivity方法的实现没有问题:
public class DMCApplication extends Application { private List<Activity> mActivityList = new ArrayList<>(); @Override public void onCreate() { super.onCreate(); // 这里可以做全局初始化,但不要放耗时操作,避免影响Activity启动 } public void addActivity(Activity activity) { // 加双重判断,避免传入null或重复添加Activity if (activity != null && !mActivityList.contains(activity)) { mActivityList.add(activity); } } }
按照这三步排查下来,基本就能解决这个空指针问题了。
内容的提问来源于stack exchange,提问作者user3140171

