You need to enable JavaScript to run this app. 如何在安卓开发中使用RxJava过滤Json数据及解决空指针报错
优惠活动
大模型
产品
解决方案
定价
更多

如何在安卓开发中使用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(),完全没有记录真实异常堆栈,排查时无法定位问题,应该将异常实例传入日志方法。
修复实现
  1. 调整过滤逻辑的equals调用顺序:用确定非空的目标常量字符串作为equals的调用方,同时增加判空、去除首尾空格的兜底,避免空指针和匹配误差(你提供的示例Json里Săn Cá Mập字段自带尾部空格,不做trim可能会出现匹配偏差)。
  2. 修正错误日志的打印逻辑,输出完整异常堆栈。

修正后的完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 12:54:01