You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,但实际存在返回空的合理场景,等于主动埋下空指针风险

修复方案
  1. 修正getUidOfLoggedInUser()方法的逻辑,适配未登录场景:
// 方案1:返回可空类型,由上层判断处理
fun getUidOfLoggedInUser(): String? {
    return FirebaseAuth.getInstance().currentUser?.uid
}

// 方案2:空场景抛出可识别的业务异常,上层捕获处理
class UserNotLoggedInException : RuntimeException()
fun getUidOfLoggedInUser(): String {
    return FirebaseAuth.getInstance().currentUser?.uid ?: throw UserNotLoggedInException()
}
  1. 调整上层业务逻辑,所有调用getUidOfLoggedInUser()的位置,先判断登录状态:
    在MainActivity触发用户加载、SharedViewModel初始化之前,先调用isUserLoggedIn()判断登录状态,未登录时直接跳转登录页,不要执行后续取uid、加载用户的逻辑。
  2. 禁止在未校验登录状态的场景下调用取用户uid的接口。

内容的提问来源于stack exchange,提问作者Edgar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:09:00