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对象。
解决方法
排查Firestore数据完整性
- 登录Firebase控制台,进入
USERS集合,确认当前登录用户的UID对应的文档是否存在,且包含完整的用户字段数据。
- 登录Firebase控制台,进入
移除强制非空断言,添加空安全处理
将第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) } } }确保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 // 其他字段按实际映射添加,建议给字段设默认值避免空指针 )验证
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) }同步用户数据写入逻辑
检查用户注册流程,确保用户注册成功后,将用户数据正确写入Firestore的USERS集合,避免登录后无对应文档的情况。
内容的提问来源于stack exchange,提问作者Sattarov
相关产品推荐
相关产品推荐

