Android应用启动崩溃:调用FirebaseUser.getUid()空指针异常如何解决
崩溃原因
你的应用崩溃是由空指针异常导致的,崩溃日志明确指向ShopMenu.java第80行:调用FirebaseUser.getUid()时,FirebaseUser对象为null。FirebaseAuth.getInstance().getCurrentUser()会在以下场景返回null:
- 当前没有处于有效登录状态的用户
- Firebase Auth 还未完成初始化就提前调用了该方法
- 之前的登录凭证已过期失效
修复方案
1. 基础修复(最简方案)
在获取FirebaseUser后增加空判断,为空时直接跳转登录页,避免后续调用空对象方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop_menu); mAuth = FirebaseAuth.getInstance(); user = FirebaseAuth.getInstance().getCurrentUser(); // 新增空判断 if (user == null) { // 替换为你自己的登录Activity类名 startActivity(new Intent(ShopMenu.this, LoginActivity.class)); finish(); return; } reference = FirebaseDatabase.getInstance().getReference("users"); userID = user.getUid(); final TextView guestUser = (TextView) findViewById(R.id.guest_User); reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { UserModel userProfile = snapshot.getValue(UserModel.class); if (userProfile != null){ String fullName = userProfile.getName(); guestUser.setText(fullName); } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ShopMenu.this, "Error: Something Happen", Toast.LENGTH_SHORT).show(); } }); }
2. 优化方案(推荐)
使用AuthStateListener监听登录状态,避免Firebase初始化延迟导致的误判,兼容性更好:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop_menu); mAuth = FirebaseAuth.getInstance(); reference = FirebaseDatabase.getInstance().getReference("users"); final TextView guestUser = (TextView) findViewById(R.id.guest_User); // 注册登录状态监听 mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser currentUser = firebaseAuth.getCurrentUser(); if (currentUser == null) { startActivity(new Intent(ShopMenu.this, LoginActivity.class)); finish(); return; } String userID = currentUser.getUid(); reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { UserModel userProfile = snapshot.getValue(UserModel.class); if (userProfile != null){ guestUser.setText(userProfile.getName()); } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ShopMenu.this, "Error: Something Happen", Toast.LENGTH_SHORT).show(); } }); } }); }
额外注意
请确认你应用的启动页不是ShopMenu,如果需要将该页面设为启动页,必须保留上述空判断或者登录状态监听逻辑,避免未登录用户直接进入页面触发崩溃。
内容的提问来源于stack exchange,提问作者James gonzales
相关产品推荐
相关产品推荐

