Firebase新账号登录触发java.lang.NullPointerException异常求助
解决java.lang.NullPointerException: 在空对象引用上调用equals()的问题
错误根源
报错行dataSnapshot.child("userType").getValue(String.class).equals("admin")触发空指针,原因是新账号在Firebase数据库的Users/{uid}/User Information节点下缺失userType字段,导致getValue(String.class)返回null,调用equals()时抛出异常。原有账号因已正确设置该字段,所以此前功能正常。
修复方案
1. 避免空指针:先判空再做比较
不要直接在可能为null的对象上调用equals(),改用常量字符串调用equals()(即使变量为null也不会报错),同时处理字段缺失的情况:
@Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { String userType = dataSnapshot.child("userType").getValue(String.class); // 用常量.equals(变量)避免空指针 if ("admin".equals(userType)) { Toast.makeText(LogInActivity.this, "登录成功", Toast.LENGTH_LONG).show(); Intent intent = new Intent(LogInActivity.this, AdminMainPageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } else if ("users".equals(userType)) { Toast.makeText(LogInActivity.this, "登录成功", Toast.LENGTH_LONG).show(); Intent intent = new Intent(LogInActivity.this, HomePage.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } else { // 处理userType为空或未知的情况 Toast.makeText(LogInActivity.this, "账号信息不完整,请检查用户类型设置", Toast.LENGTH_LONG).show(); } }
2. 修复重复启动Activity的BUG
原代码中存在重复调用startActivity()的错误,会导致页面重复打开,需删除多余的启动代码:
// 错误写法:重复启动 Intent intent = new Intent(LogInActivity.this, AdminMainPageActivity.class); startActivity(new Intent(getApplicationContext(), AdminMainPageActivity.class)); // 此行多余 intent.setFlags(...); startActivity(intent); // 正确写法:只保留一次启动 Intent intent = new Intent(LogInActivity.this, AdminMainPageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
3. 检查数据库新账号数据
登录Firebase控制台,查看新账号对应的Users/{uid}/User Information节点,确认userType字段是否存在且值为"admin"或"users"。如果缺失,需要在账号注册流程中添加写入userType字段的逻辑。
内容的提问来源于stack exchange,提问作者SUSHI Y
相关产品推荐
相关产品推荐

