跨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
相关产品推荐
相关产品推荐

