调用User.getName()报空对象错误,读取Firebase的EmailUsers数据显示失败
问题修复方案
崩溃原因
Attempt to invoke virtual method 'java.lang.String com.practice.projectbm.Model.User.getName()' on a null object reference 报错的直接原因是:你在ProfileFragment的userInfo()方法中,从Firebase数据库读取用户数据时,snapshot.getValue(User.class)返回了null,后续直接调用user.getName()触发了空指针异常。
修复步骤
- 第一步:添加空值防护,避免崩溃
修改userInfo()方法的逻辑,先判断User对象非空再操作,代码如下:private void userInfo() { FirebaseDatabase.getInstance().getReference().child("EmailUsers").child(profileId).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { User user = snapshot.getValue(User.class); if (user != null) { username.setText(user.getName()); bioo.setText(user.getBio()); } else { // 序列化失败时设置默认值 username.setText("加载失败"); bioo.setText("暂无简介"); } } else { // 对应UID的用户节点不存在时的处理 username.setText("用户不存在"); bioo.setText("暂无简介"); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 可在此打印错误日志排查问题 Log.e("ProfileLoadError", error.getMessage()); } }); } - 第二步:排查数据库配置问题
- 确认Firebase Realtime Database中存在
EmailUsers根节点,拼写、大小写和代码完全一致 - 确认当前登录用户的UID(即
profileId的值)在EmailUsers节点下存在对应子节点 - 确认
EmailUsers/[用户UID]节点下的字段名和User类的字段名完全一致,大小写不能有差异:比如User类中图片地址字段名为Imageurl,数据库中不能写成imageUrl,否则会导致序列化失败返回null - 检查Firebase数据库的读写规则,确保当前登录用户有读取
EmailUsers节点的权限
- 确认Firebase Realtime Database中存在
- 第三步:额外优化
可以在获取当前Firebase用户时也添加空判断,避免用户未登录时调用fire.getUid()触发空指针:fire = FirebaseAuth.getInstance().getCurrentUser(); if (fire != null) { profileId = fire.getUid(); userInfo(); getFollowersAndFollowingCount(); } else { // 未登录时的处理逻辑,比如跳转到登录页 }
内容的提问来源于stack exchange,提问作者Swaraj Hegde
相关产品推荐
相关产品推荐

