Home > Net >  Android Studio Kotlin Null Pointer Exception while updating Firestore Database
Android Studio Kotlin Null Pointer Exception while updating Firestore Database

Time:12-28

I've recently stumbled upon a runtime error that crashes my application for whatever reason and I cannot get to the bottom of it. Basically I am updating user profile data by storing it in a hashmap. This is what the user class looks like:

@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

In an activity I called UserProfileActivity I store the mobile and gender into a hashmap, then call the Firebase function to update the Firestore Database. Here is a method of the activity. When the button "submit" is clicked, this code runs:

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
                )
            }
        }

Now the called method that communicates with the database:

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()
                    }
                }
            }


}

But I am getting this error:

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)

I have absolutely no clue where the null pointer exception is occuring... And funnily enough (this is important), the database DOES get updated properly so why is it crashing?? Any help would be much appreciated. :)

CodePudding user response:

This specific error has been showing up a lot lately, and seems to be due to an inconsistent nullability annotation in Firebase listeners.

Apparently Google is aware of the issue and may have recently fixed it

When adding an onSuccessListener for an update call in Kotlin it infers a non-null type for it (Void not Void?). This means if Firestore returns a null result (which would not be uncommon for a Void argument from java), it will raise the error you showed when it is cast to a non-null parameter. The solution is to update to the latest version that fixes this, or if you need an immediate workaround to specifically set the type to nullable, so to change

.addOnSuccessListener { 
    println("Updated doc")
}

to

.addOnSuccessListener { _: Void? ->
    println("Updated doc")
}
  • Related