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

Firebase登录触发NullPointerException问题求助

Firebase登录时NullPointerException问题排查与解决

用户登录Firebase账号时触发空指针异常,相关代码及报错信息如下:

相关代码

FirestoreClass.kt

class FirestoreClass {
    fun getUserDetails(activity: Activity){
        mFirestore.collection(Constants.USERS)
            .document(getCurrentUserID())
            .get()
            .addOnSuccessListener { document ->
                Log.i(activity.javaClass.simpleName, document.toString())

                val user = document.toObject(User::class.java)!!

                when(activity){
                    is LoginActivity-> {
                        activity.userLoggedInSuccess(user)
                    }
                }
            }
            .addOnFailureListener { e->
                when(activity){
                    is LoginActivity -> {
                        activity.hideProgressDialog()
                    }
                }
                Log.e(
                    activity.javaClass.simpleName,
                    "Error while getting user details.", e
                )
            }
    }
}

LoginActivity.kt

class LoginActivity : BaseActivity() {
    private fun logInRegisteredUser(){
        if (validateLoginDetails()) {
            showProgressDialog(resources.getString(R.string.please_wait))

            val email = binding.etEmail.text.toString().trim { it <= ' '}
            val password = binding.etPassword.text.toString().trim { it <= ' '}

            FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
                .addOnCompleteListener { task ->
                    if (task.isSuccessful){
                        FirestoreClass().getUserDetails(this@LoginActivity)
                    }else{
                        hideProgressDialog()
                        showErrorSnackbar(task.exception!!.message.toString(), true)
                    }
                }
        }
    }
}

报错信息

java.lang.NullPointerException
at com.xikmat.osonjob.firestore.FirestoreClass$getUserDetails$1.invoke(FirestoreClass.kt:55)
at com.xikmat.osonjob.firestore.FirestoreClass$getUserDetails$1.invoke(FirestoreClass.kt:52)

问题原因分析

空指针异常触发在FirestoreClass.kt第55行的val user = document.toObject(User::class.java)!!,核心原因是document.toObject(User::class.java)返回了null,而!!强制非空断言直接引发崩溃,具体可能的诱因包括:

  • Firestore的USERS集合中不存在当前登录用户ID对应的文档:虽然Firebase Auth登录成功,但用户数据未同步写入Firestore,导致查询到的文档无有效数据。
  • User类与Firestore文档字段不匹配:比如字段名大小写不一致、缺少必要字段,或者未使用@PropertyName注解映射不同命名规则的字段,导致无法正确反序列化为User对象。
  • getCurrentUserID()方法返回无效值:比如未正确获取当前Auth用户的UID,查询了错误的文档路径,导致返回的文档无法转换为User对象。

解决方法

  1. 排查Firestore数据完整性

    • 登录Firebase控制台,进入USERS集合,确认当前登录用户的UID对应的文档是否存在,且包含完整的用户字段数据。
  2. 移除强制非空断言,添加空安全处理
    将第55行的代码修改为安全处理逻辑,避免直接崩溃,同时增加日志辅助排查:

    val user = document.toObject(User::class.java)
    if (user != null) {
        when(activity){
            is LoginActivity-> activity.userLoggedInSuccess(user)
        }
    } else {
        Log.e(activity.javaClass.simpleName, "Failed to parse user data from Firestore document")
        when(activity){
            is LoginActivity-> {
                activity.hideProgressDialog()
                activity.showErrorSnackbar("User data not found in database", true)
            }
        }
    }
    
  3. 确保User类与Firestore字段映射正确
    如果Firestore文档使用下划线命名(如user_name),而Kotlin类使用驼峰命名(如userName),需要添加@PropertyName注解:

    import com.google.firebase.firestore.PropertyName
    
    data class User(
        @PropertyName("user_name") val userName: String? = null,
        @PropertyName("email") val email: String? = null
        // 其他字段按实际映射添加,建议给字段设默认值避免空指针
    )
    
  4. 验证getCurrentUserID()的正确性
    确保该方法返回当前已登录用户的UID,避免返回空值或错误ID:

    fun getCurrentUserID(): String {
        val currentUser = FirebaseAuth.getInstance().currentUser
        return currentUser?.uid ?: throw IllegalStateException("No user logged in")
    }
    

    同时在LoginActivity中登录成功后打印UID日志,确认ID正确:

    if (task.isSuccessful){
        val currentUid = FirebaseAuth.getInstance().currentUser?.uid
        Log.d("LoginActivity", "Logged in user UID: $currentUid")
        FirestoreClass().getUserDetails(this@LoginActivity)
    }
    
  5. 同步用户数据写入逻辑
    检查用户注册流程,确保用户注册成功后,将用户数据正确写入Firestore的USERS集合,避免登录后无对应文档的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:35:23