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

