Android启动MainActivity时FirebaseAuth空指针异常问题求助
问题根因
你遇到的空指针异常核心是:调用getUidOfLoggedInUser()方法时,FirebaseAuth.getInstance().currentUser为空,代码中使用非空断言符!!强制取值直接触发崩溃。
你的修改无效的原因
你调整后的getUidOfLoggedInUser()逻辑存在明显错误:
- 当检测到
currentUser?.uid为空时,你调用了FirebaseAuth.getInstance().signOut(),该操作会主动将currentUser置为null - 后续你依旧使用
!!强制读取currentUser.uid,此时currentUser必然为空,空指针还是会触发
其他隐藏问题
从崩溃堆栈可以看出,你在MainActivity.onCreate阶段初始化SharedViewModel时,就直接触发了加载用户、取uid的逻辑,存在两个逻辑漏洞:
- 首次打开应用、用户已登出、Firebase Auth还未完成本地持久化登录状态恢复的场景下,
currentUser本身就是空的,属于正常业务场景 getUidOfLoggedInUser()方法设计不合理:返回值声明为不可空String,但实际存在返回空的合理场景,等于主动埋下空指针风险
修复方案
- 修正
getUidOfLoggedInUser()方法的逻辑,适配未登录场景:
// 方案1:返回可空类型,由上层判断处理 fun getUidOfLoggedInUser(): String? { return FirebaseAuth.getInstance().currentUser?.uid } // 方案2:空场景抛出可识别的业务异常,上层捕获处理 class UserNotLoggedInException : RuntimeException() fun getUidOfLoggedInUser(): String { return FirebaseAuth.getInstance().currentUser?.uid ?: throw UserNotLoggedInException() }
- 调整上层业务逻辑,所有调用
getUidOfLoggedInUser()的位置,先判断登录状态:
在MainActivity触发用户加载、SharedViewModel初始化之前,先调用isUserLoggedIn()判断登录状态,未登录时直接跳转登录页,不要执行后续取uid、加载用户的逻辑。 - 禁止在未校验登录状态的场景下调用取用户uid的接口。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

