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

获取Intent中Long变量时触发java.lang.NullPointerException求助

排查EditGroup页面的NullPointerException异常

问题根源

异常提示Attempt to invoke virtual method 'long android.os.Bundle.getLong(java.lang.String)' on a null object reference,说明getIntent().getExtras()返回了null,导致后续调用getLong时触发空指针。虽然你认为只有编辑按钮能启动该页面,但线上用户的使用场景更复杂,存在多种可能触发该问题的情况。

可能的触发场景

  • 系统内存回收导致Activity重建:当应用在后台被系统杀掉后,用户重新返回时,系统会重建EditGroup页面,但此时原Intent的extras可能已经丢失。
  • 意外启动入口:用户可能通过第三方启动器、快捷方式、系统深层链接或其他未知途径直接打开了EditGroup,此时Intent没有携带必要的参数。
  • 代码边缘场景:虽然测试未发现,但跳转逻辑中可能存在分支导致putExtra未被执行(比如极端情况下的异步回调异常)。

解决方案

1. 增加防御性空判断(最核心的修复)

在EditGroup的onCreate方法中,不要直接链式调用getIntent().getExtras().getLong(),先逐层判断null:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ... 其他初始化代码

    long idGroup = -1;
    Intent intent = getIntent();
    if (intent != null) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            idGroup = extras.getLong("idGroup", -1); // 给默认值-1表示无效ID
        }
    }

    if (idGroup == -1) {
        // 处理无效参数的情况,提示用户并关闭页面
        Toast.makeText(this, "无法获取有效分组信息", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    // 正常加载数据库信息
    loadGroupInfo(idGroup);
}

2. 保存Activity状态,避免重建时丢失参数

重写onSaveInstanceState和onRestoreInstanceState,确保Activity被系统重建时能恢复分组ID:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    long idGroup = getIntent().getExtras() != null ? getIntent().getExtras().getLong("idGroup", -1) : -1;
    outState.putLong("saved_idGroup", idGroup);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    long idGroup = -1;

    // 优先从保存的状态中恢复
    if (savedInstanceState != null) {
        idGroup = savedInstanceState.getLong("saved_idGroup", -1);
    } else {
        // 从Intent中获取
        Intent intent = getIntent();
        if (intent != null && intent.getExtras() != null) {
            idGroup = intent.getExtras().getLong("idGroup", -1);
        }
    }

    if (idGroup == -1) {
        Toast.makeText(this, "无法获取有效分组信息", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    loadGroupInfo(idGroup);
}

3. 限制EditGroup的启动入口(可选)

在AndroidManifest.xml中,给EditGroup添加android:exported="false"(如果不需要被其他应用启动),避免第三方应用意外触发:

<activity
    android:name=".EditGroup"
    android:exported="false" />

为什么测试环境未复现?

测试环境通常不会触发系统内存回收,也不会模拟第三方启动的场景,而线上用户的设备、系统版本和使用习惯差异很大,这些边缘场景只有在真实用户使用时才会暴露。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:18:36