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

Android调用String.equals报NullPointerException空对象引用错误如何解决

问题成因

该空指针异常抛出位置为MainActivity.java第180行,对应代码中的!user.getUid().equals(FirebaseAuth.getInstance().getUid())判断逻辑,触发原因是调用equals方法的主体对象为null,具体可能的场景有三类:

  • snapshot1.getValue(User.class)解析数据失败,返回的user对象为null,后续调用user.getUid()直接触发空指针
  • user对象解析成功,但user.getUid()返回null,此时null对象调用equals方法触发异常
  • (低概率)当前Firebase登录状态失效,FirebaseAuth.getInstance().getUid()返回null,该场景下若user.getUid()非空,调用equals只会返回false,不会抛出异常
解决方案

1. 代码层增加空值校验

优先将确定非空的对象作为equals方法的调用主体,同时提前对所有可能为空的变量做判断,过滤无效数据避免崩溃,修改后的代码如下:

database.getReference().child("users").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        users.clear();
        // 提前获取当前登录用户UID,判断登录状态
        String currentUid = FirebaseAuth.getInstance().getUid();
        // 未登录时直接结束逻辑更新UI
        if (currentUid == null) {
            binding.recyclerView.hideShimmerAdapter();
            usersAdapter.notifyDataSetChanged();
            return;
        }
        for(DataSnapshot snapshot1 : snapshot.getChildren()) {
            User user = snapshot1.getValue(User.class);
            // 多重空校验,只有用户对象、用户UID都非空,且不等于当前登录用户UID时才加入列表
            if (user != null && user.getUid() != null && !currentUid.equals(user.getUid())) {
                users.add(user);
            }
        }
        binding.recyclerView.hideShimmerAdapter();
        usersAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 补充错误日志,方便排查数据拉取异常
        Log.e("MainActivity", "拉取用户数据失败: " + error.getMessage());
    }
});

2. 数据结构校验

  • 检查User类的字段定义,确保uid字段的命名和Firebase数据库中users节点下的字段名完全匹配,无大小写混淆、注解配置错误等序列化映射问题
  • 检查Firebase数据库的users节点数据,确认所有用户条目下都存储了有效的uid字段,无字段缺失情况

内容的提问来源于stack exchange,提问作者chetan patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:18:03