如何在安卓开发中使用RxJava过滤Json数据及解决空指针报错
报错根因
- 触发空指针的直接原因:过滤逻辑里调用
result.getGameName().equals("Bắn cá 2021")时,result.getGameName()返回了null。Java中null对象不能直接调用实例方法,因此抛出空引用异常。 - 连带排查点:如果解析后所有对象的
gameName都是null,需要检查TipsModel类的Json字段映射是否正确——若使用Gson等工具解析,要确保gameName字段通过@SerializedName("game_name")注解和返回的Json key对应,避免解析值为空。 - 原有错误回调的问题:错误日志打印的是
tipsList.toString(),完全没有记录真实异常堆栈,排查时无法定位问题,应该将异常实例传入日志方法。
修复实现
- 调整过滤逻辑的equals调用顺序:用确定非空的目标常量字符串作为equals的调用方,同时增加判空、去除首尾空格的兜底,避免空指针和匹配误差(你提供的示例Json里
Săn Cá Mập字段自带尾部空格,不做trim可能会出现匹配偏差)。 - 修正错误日志的打印逻辑,输出完整异常堆栈。
修正后的完整getTips方法代码:
//此方法为修正后的Json数据过滤逻辑 public void getTips(){ repository.getTips() .flatMap(Observable::fromIterable) .filter(result -> { String gameName = result.getGameName(); // 1. 当gameName为null时返回空串,避免空指针 // 2. 去除首尾空格,匹配实际返回的字符串内容 // 3. 用常量字符串作为equals调用方,从根源避免空指针 return "Bắn cá 2021".equals(gameName == null ? "" : gameName.trim()); }) .toList() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( // 数据过滤完成后更新LiveData result -> tipsList.setValue(result), // 打印真实异常,不再输出无意义的tipsList字符串 error -> Log.e(TAG, "getTips 加载游戏提示数据失败", error) ); }
字段映射校验参考
如果你的TipsModel使用Gson解析,需要确保字段和Json key的映射正确,示例写法:
public class TipsModel { private int id; @SerializedName("game_name") private String gameName; // 其余字段省略定义 public String getGameName() { return gameName; } }
内容的提问来源于stack exchange,提问作者Gio Dude
相关产品推荐
相关产品推荐

