空对象引用异常:调用FirebaseUser.getUid()报错求助
解决Firebase Auth空指针异常:getCurrentUser()返回null的问题
你的NullPointerException触发点在currentUserKey = firebaseAuth.getCurrentUser().getUid();,核心原因是firebaseAuth.getCurrentUser()返回了null,此时直接调用getUid()就会引发空对象引用。getCurrentUser()返回null通常是以下几种情况:用户未登录、Firebase Auth初始化未完成、用户会话已过期或被注销。
解决方案1:先校验用户状态再获取UID
在调用getUid()之前,必须先判断当前用户是否存在,避免直接链式调用:
firebaseAuth = FirebaseAuth.getInstance(); firebaseFirestore = FirebaseFirestore.getInstance(); // 先获取当前用户对象,判空后再操作 FirebaseUser currentUser = firebaseAuth.getCurrentUser(); if (currentUser != null) { currentUserKey = currentUser.getUid(); // 所有依赖currentUserKey的逻辑都放在这个代码块内 } else { // 用户未登录,跳转到登录页面并关闭当前页面 Intent loginIntent = new Intent(PatientDashboardActivity.this, LoginActivity.class); startActivity(loginIntent); finish(); Toast.makeText(getApplicationContext(), "请先登录账号", Toast.LENGTH_SHORT).show(); }
解决方案2:用AuthStateListener监听用户状态(推荐)
Firebase Auth的getCurrentUser()可能在应用启动初期还未完成初始化,此时返回null属于正常情况。通过AuthStateListener可以监听用户登录状态的实时变化,确保在状态稳定后执行逻辑:
private FirebaseAuth.AuthStateListener authStateListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_patient_dashboard); // ... 权限检查、SharedPreferences初始化等代码 ... firebaseAuth = FirebaseAuth.getInstance(); firebaseFirestore = FirebaseFirestore.getInstance(); // 初始化Auth状态监听器 authStateListener = auth -> { FirebaseUser user = auth.getCurrentUser(); if (user != null) { currentUserKey = user.getUid(); // 执行需要用户UID的逻辑,比如加载用户信息、初始化视图 initUserRelatedViews(); } else { // 用户未登录,跳转登录页 startActivity(new Intent(PatientDashboardActivity.this, LoginActivity.class)); finish(); } }; } // 页面启动时添加监听器 @Override protected void onStart() { super.onStart(); firebaseAuth.addAuthStateListener(authStateListener); } // 页面停止时移除监听器,避免内存泄漏 @Override protected void onStop() { super.onStop(); if (authStateListener != null) { firebaseAuth.removeAuthStateListener(authStateListener); } } private void initUserRelatedViews() { UserName = getIntent().getStringExtra("UserName"); drawerLayout = findViewById(R.id.drawer); nav_name = findViewById(R.id.nav_name); nav_name.setText(UserName); book_doctor = findViewById(R.id.book_doctor); active_appointments = findViewById(R.id.active_appointments); bookRideCard = findViewById(R.id.bookRideCardPDashboard); // ... 其他视图初始化逻辑 ... }
额外检查项
- 确保你的登录流程中,只有用户成功登录后才会跳转到
PatientDashboardActivity,避免未登录状态直接进入该页面。 - 检查SharedPreferences中存储的用户信息是否与Firebase Auth的当前用户一致,避免出现会话不一致的情况。
内容的提问来源于stack exchange,提问作者Vikas Patel
相关产品推荐
相关产品推荐

