Android 更新 Firestore 数据库时出现 Studio Kotlin 空指针异常
Android Studio Kotlin Null Pointer Exception while updating Firestore Database
我最近偶然发现了一个运行时错误,该错误使我的应用程序因某种原因而崩溃,而我无法深入了解它。基本上我通过将用户配置文件数据存储在哈希图中来更新它。这是用户 class 的样子:
@Parcelize
data class User(
val id: String = "",
val firstName: String = "",
val lastName: String = "",
val email: String = "",
val image: String = "",
val mobile: Long = 0,
val gender: String = "",
val profileCompleted: Int = 0): Parcelable
在一个名为 UserProfileActivity 的 activity 中,我将手机和性别存储到哈希图中,然后调用 Firebase 函数来更新 Firestore 数据库。这里有一个方法activity。单击“提交”按钮时,运行此代码:
btn_submit.setOnClickListener {
if(validateUserProfileDetails()){ //checks if entered credentials are valid
val userHashMap = HashMap<String, Any>() //creates the hashmap
val mobileNumber = et_mobile_number.text.toString().trim { it <= ' ' }
val gender = if (rb_male.isChecked) { //these are radio buttons, only 1 clicked
Constants.MALE
} else {
Constants.FEMALE
}
userHashMap[Constants.MOBILE] = mobileNumber.toLong() //storing info in hashmap
userHashMap[Constants.GENDER] = gender
showProgressDialog(resources.getString(R.string.please_wait)) //starting a progress dialog
FirestoreClass().updateUserProfileData( //method in FirestoreClass
this, userHashMap
)
}
}
现在调用的与数据库通信的方法:
fun updateUserProfileData(activity: Activity, userHashMap: HashMap<String, Any>) {
mFireStore.collection(Constants.USERS) // collection named "users"
.document(getCurrentUserID()) //getCurrentUserID() just gets the current user id
.update(userHashMap) // hashmap used to update the user
.addOnSuccessListener {
when (activity) {
is UserProfileActivity -> {
activity.userProfileUpdateSuccess() //this just hides the progress dialog and finishes the activity in the UserProfileActivity
}
}
}
.addOnFailureListener { e ->
when (activity) {
is UserProfileActivity -> {
activity.hideProgressDialog()
}
}
}
}
但是我收到这个错误:
2021-12-27 02:35:38.727 14960-14960/com.example.myshopapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myshopapp, PID: 14960
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter it
at com.example.myshopapp.firestore.FirestoreClass.updateUserProfileData$lambda-2(Unknown Source:7)
at com.example.myshopapp.firestore.FirestoreClass.$r8$lambda$vs4EuaGwStcL-i3lXRUecduDHWM(Unknown Source:0)
at com.example.myshopapp.firestore.FirestoreClass$$ExternalSyntheticLambda4.onSuccess(Unknown Source:4)
at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.0:1)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
我完全不知道空指针异常发生在哪里...有趣的是(这很重要),数据库确实得到了正确更新,为什么它崩溃了?任何帮助将非常感激。 :)
这个特定错误最近经常出现,似乎是由于 Firebase 侦听器中的可空性注释不一致造成的。
显然 Google 知道 the issue and may have recently fixed it
在 Kotlin 中为 update
调用添加 onSuccessListener
时,它会推断 it
的非空类型(Void
而非 Void?
)。这意味着如果 Firestore returns 一个空结果(对于来自 java 的 Void
参数来说并不少见),它将引发您在将其转换为非空时显示的错误范围。解决方案是更新到修复此问题的最新版本,或者如果您需要立即解决方法以专门将类型设置为可为空,则更改
.addOnSuccessListener {
println("Updated doc")
}
到
.addOnSuccessListener { _: Void? ->
println("Updated doc")
}
我最近偶然发现了一个运行时错误,该错误使我的应用程序因某种原因而崩溃,而我无法深入了解它。基本上我通过将用户配置文件数据存储在哈希图中来更新它。这是用户 class 的样子:
@Parcelize
data class User(
val id: String = "",
val firstName: String = "",
val lastName: String = "",
val email: String = "",
val image: String = "",
val mobile: Long = 0,
val gender: String = "",
val profileCompleted: Int = 0): Parcelable
在一个名为 UserProfileActivity 的 activity 中,我将手机和性别存储到哈希图中,然后调用 Firebase 函数来更新 Firestore 数据库。这里有一个方法activity。单击“提交”按钮时,运行此代码:
btn_submit.setOnClickListener {
if(validateUserProfileDetails()){ //checks if entered credentials are valid
val userHashMap = HashMap<String, Any>() //creates the hashmap
val mobileNumber = et_mobile_number.text.toString().trim { it <= ' ' }
val gender = if (rb_male.isChecked) { //these are radio buttons, only 1 clicked
Constants.MALE
} else {
Constants.FEMALE
}
userHashMap[Constants.MOBILE] = mobileNumber.toLong() //storing info in hashmap
userHashMap[Constants.GENDER] = gender
showProgressDialog(resources.getString(R.string.please_wait)) //starting a progress dialog
FirestoreClass().updateUserProfileData( //method in FirestoreClass
this, userHashMap
)
}
}
现在调用的与数据库通信的方法:
fun updateUserProfileData(activity: Activity, userHashMap: HashMap<String, Any>) {
mFireStore.collection(Constants.USERS) // collection named "users"
.document(getCurrentUserID()) //getCurrentUserID() just gets the current user id
.update(userHashMap) // hashmap used to update the user
.addOnSuccessListener {
when (activity) {
is UserProfileActivity -> {
activity.userProfileUpdateSuccess() //this just hides the progress dialog and finishes the activity in the UserProfileActivity
}
}
}
.addOnFailureListener { e ->
when (activity) {
is UserProfileActivity -> {
activity.hideProgressDialog()
}
}
}
}
但是我收到这个错误:
2021-12-27 02:35:38.727 14960-14960/com.example.myshopapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myshopapp, PID: 14960
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter it
at com.example.myshopapp.firestore.FirestoreClass.updateUserProfileData$lambda-2(Unknown Source:7)
at com.example.myshopapp.firestore.FirestoreClass.$r8$lambda$vs4EuaGwStcL-i3lXRUecduDHWM(Unknown Source:0)
at com.example.myshopapp.firestore.FirestoreClass$$ExternalSyntheticLambda4.onSuccess(Unknown Source:4)
at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.0:1)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
我完全不知道空指针异常发生在哪里...有趣的是(这很重要),数据库确实得到了正确更新,为什么它崩溃了?任何帮助将非常感激。 :)
这个特定错误最近经常出现,似乎是由于 Firebase 侦听器中的可空性注释不一致造成的。
显然 Google 知道 the issue and may have recently fixed it
在 Kotlin 中为 update
调用添加 onSuccessListener
时,它会推断 it
的非空类型(Void
而非 Void?
)。这意味着如果 Firestore returns 一个空结果(对于来自 java 的 Void
参数来说并不少见),它将引发您在将其转换为非空时显示的错误范围。解决方案是更新到修复此问题的最新版本,或者如果您需要立即解决方法以专门将类型设置为可为空,则更改
.addOnSuccessListener {
println("Updated doc")
}
到
.addOnSuccessListener { _: Void? ->
println("Updated doc")
}