You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment调用MainActivity方法遇空指针,求非Bundle实现方案

问题:Fragment调用MainActivity方法触发NullPointerException的原因及解决方案

问题场景代码

Fragment中的方法:

private void getDataFromMainActivity(String object) {
    MainActivity mainActivity = new MainActivity();
    List<ModelData> newDataList = mainActivity.getDataForTab(object);
    callAdapter(newDataList);
    progressBar.setVisibility(View.GONE);
}

MainActivity中的方法:

public List<ModelData> getDataForTab(String object) {
   return allData.get(object);
}

运行时抛出NullPointerException,MainActivity内部打印allData不为空,但Fragment中调用时始终返回null。


原因分析

你在Fragment里通过new MainActivity()创建了一个全新的MainActivity实例,这个实例和当前正在运行的、已经初始化好allData的MainActivity完全是两个独立对象。新创建的Activity既没有经过系统的生命周期初始化流程,也没有填充过allData数据,所以调用getDataForTab时返回null,进而触发空指针异常。


不使用Bundle的解决方案

Fragment依附于Activity存在,正确的做法是获取当前绑定的已运行的MainActivity实例,而非新建对象:

修改Fragment中的方法:

private void getDataFromMainActivity(String object) {
    // 安全获取当前关联的MainActivity实例
    if (requireActivity() instanceof MainActivity) {
        MainActivity mainActivity = (MainActivity) requireActivity();
        List<ModelData> newDataList = mainActivity.getDataForTab(object);
        // 建议加非空判断,避免后续callAdapter处理空列表
        if (newDataList != null) {
            callAdapter(newDataList);
        }
        progressBar.setVisibility(View.GONE);
    }
}

补充说明

  • requireActivity()是Fragment的API,会返回当前绑定的Activity实例,如果Fragment未绑定则抛出异常,比getActivity()更严谨;
  • 加instanceof判断是为了避免类型转换异常,确保当前Fragment确实依附于MainActivity;
  • 额外增加newDataList的非空判断,可以进一步避免后续逻辑出现空指针。

内容的提问来源于stack exchange,提问作者Andro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:54:57