Android onDataChange触发toString空指针 读取Firebase数据报错解决
问题描述
运行Android Studio项目对接Firebase实时数据库、实现数据拉取及图表展示功能时,触发如下空指针崩溃:Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
异常栈定位到Firebase数据回调的onDataChange方法中,报错截图如下:
触发崩溃的业务代码如下:
@Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.hasChildren()) { for (DataSnapshot mDataSnapshot : snapshot.getChildren()) { String suhu = mDataSnapshot.child("Suhu").getValue().toString(); Suhuu.setText(suhu); final Float nilai = Float.valueOf(suhu); if (nilai >= 22 && nilai <= 33) { kondisi.setText("Ideal"); } else if (nilai >= 34 && nilai <= 59) { kondisi.setText("Panas"); } else if (nilai < 22) { kondisi.setText("Dingin"); } else if (nilai > 60) { kondisi.setText("Sangat Panas"); } } } }
崩溃根因
崩溃直接触发点是mDataSnapshot.child("Suhu").getValue().toString()这行代码:
- 当Firebase返回的子节点中不存在
Suhu字段、字段值为null,或是安全规则限制导致客户端拉取不到该字段值时,getValue()会返回null,此时直接调用null对象的toString()方法就会抛出空指针异常。 - 现有代码未做任何空值校验、类型转换异常捕获,只要单条数据不符合预期就会直接崩溃。
排查&解决步骤
- 先核对Firebase控制台的数据结构
- 确认查询的数据库路径下,所有子节点都存在
Suhu字段,且字段值为可转换为数字的合法格式 - 检查Firebase数据库安全规则,确认App当前登录账号拥有该路径下
Suhu字段的读权限,避免权限不足导致字段值拉取为null
- 确认查询的数据库路径下,所有子节点都存在
- 给代码加空安全校验和异常捕获,避免单条异常数据导致整个功能崩溃,同时补全原有逻辑的区间判断漏洞
修复后的参考代码如下:@Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.hasChildren()) { for (DataSnapshot mDataSnapshot : snapshot.getChildren()) { // 先取出字段值,禁止直接链式调用toString Object suhuObj = mDataSnapshot.child("Suhu").getValue(); // 值为空直接跳过当前条目的处理,不触发崩溃 if (suhuObj == null) continue; String suhu = suhuObj.toString(); Suhuu.setText(suhu); try { float nilai = Float.parseFloat(suhu); String kondisiText; if (nilai >= 22 && nilai <= 33) { kondisiText = "Ideal"; } else if (nilai >= 34 && nilai <= 59) { kondisiText = "Panas"; } else if (nilai < 22) { kondisiText = "Dingin"; } else { // 补全原逻辑59<nilai<=60的遗漏区间 kondisiText = "Sangat Panas"; } kondisi.setText(kondisiText); } catch (NumberFormatException e) { // 捕获字段值非合法数字的转换异常,打印日志即可 e.printStackTrace(); } } } }
内容的提问来源于stack exchange,提问作者Vania Reviana
相关产品推荐
相关产品推荐

