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

跨Activity传递JSON时触发空对象引用错误,求技术排查解决

解决Intent传递JSON时的空指针异常:尝试在空对象引用上调用String.length()

嘿,我一眼就看到问题所在啦!你踩了一个Intent使用的经典小坑——你在启动Activity之后才给Intent添加额外数据,这直接导致传递过去的Intent根本没带上你想传的JSON字符串,接收端拿到空值后自然触发了空指针异常。

问题根源拆解

在你的LoginActivity代码里,执行顺序完全搞反了:

// 错误顺序:先启动Activity,再添加数据
Intent intent = new Intent(LoginActivity.this,EmpLoginActivity.class);
startActivity(intent); // 这里已经把空数据的Intent发出去了
intent.putExtra("data",jsonObject.toString()); // 这步操作对已启动的Activity毫无作用

当你调用startActivity(intent)时,系统已经把这个没有附加数据的Intent发送给系统去启动EmpLoginActivity了,后续的putExtra只是修改了本地的Intent对象,对已经启动的目标Activity没有任何影响。

所以在EmpLoginActivity里,getIntent().getStringExtra("data")得到的是null,而JSONObject的构造函数在接收null时,内部会尝试调用String.length()方法,这就触发了"尝试在空对象引用上调用虚拟方法'int java.lang.String.length()'"的错误。

修正后的代码

1. LoginActivity(调整顺序,先加数据再启动)

Intent intent = new Intent(LoginActivity.this, EmpLoginActivity.class);
intent.putExtra("data", jsonObject.toString()); // 先添加数据,再启动Activity
startActivity(intent);

2. EmpLoginActivity(添加空值判断,增强健壮性)

为了避免后续再出现类似崩溃,建议先判断数据是否有效,同时用optString()替代getString()(避免JSON键不存在时抛出异常):

try {
    String jsonStr = getIntent().getStringExtra("data");
    // 先判断字符串是否有效,避免空指针
    if (jsonStr != null && !jsonStr.isEmpty()) {
        JSONObject jsonObject = new JSONObject(jsonStr);
        // 用optString指定默认值,防止键不存在时崩溃
        tv1.setText(jsonObject.optString("name", "未获取到名称"));
        tv2.setText(jsonObject.optString("type", "未获取到类型"));
        tv3.setText(jsonObject.optString("hours", "0"));
    } else {
        // 处理数据为空的情况
        tv1.setText("数据加载失败");
    }
} catch (JSONException e) {
    e.printStackTrace();
    // 处理JSON解析异常
    tv1.setText("数据解析错误");
}

额外小建议

  • 如果传递的JSON结构比较复杂,也可以考虑将JSON转换为Bundle或者自定义Parcelable对象传递,这样类型更安全,也能避免字符串解析的潜在问题。
  • 永远记得:Intent的额外数据必须在调用startActivity()/startActivityForResult()之前添加,否则都是无效操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:55