VETLance
VETLance

Reputation: 43

Fatal Exception: java.lang.NullPointerException Crash

I have a crash that some times happening. According to firebase keys : -Fatal Exception: java.lang.NullPointerException phoneCursor.getString( … ) must not be null

this crash caused by ContactHelperClass the code will be below :

fun getContactInformation(activity: Activity, data: Intent, completion: (Buyer) -> Unit) {

    val buyer = Buyer()
    val contentUri = data.data
    val contentResolver = activity.contentResolver

    val cursor = contentResolver.query(contentUri!!, null, null, null, null)

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            val contactId =
                cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
            if (cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME) > 0) {
                buyer.firstName =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
            }
            if (cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) > 0) {
                val phoneCursor = contentResolver.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                    arrayOf(contactId),
                    null
                )
                if (phoneCursor != null) {

                    if (phoneCursor.count > 1) {

                        val values = ArrayList<ContactBuyer>()

                        while (phoneCursor.moveToNext()) {

                            val contact = ContactBuyer()

                            contact.phoneNumber = phoneCursor.getString(
                                phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                            )

                            try {

                                when (phoneCursor.getString(
                                    phoneCursor.getColumnIndex(
                                        ContactsContract.CommonDataKinds.Phone.TYPE
                                    )
                                ).toInt()) {

                                    ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> {

                                        contact.name =
                                            R.string.buyer_select_phone_number_type_home.localized()

                                    }

                                    ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> {

                                        contact.name =
                                            R.string.buyer_select_phone_number_type_work.localized()

                                    }

                                    ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> {

                                        contact.name =
                                            R.string.buyer_select_phone_number_type_fax.localized()

                                    }

                                    ContactsContract.CommonDataKinds.Phone.TYPE_OTHER -> {

                                        contact.name =
                                            R.string.shared_other.localized()

                                    }

                                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> {

                                        contact.name =
                                            R.string.buyer_select_phone_number_type_mobile.localized()

                                    }

                                }

                            } catch (ex: Throwable) {

                                contact.name =
                                    R.string.shared_other.localized()

                            }

                            values.add((contact))

                        }

                        BuyerMultiNumberDialog().showDialog(
                            values,
                            object : BuyerMultiNumberInterface {
                                override fun onSelectedNumber(phoneNumber: String) {

                                    try {

                                        parsePhoneNumberFromContacts(
                                            activity,
                                            phoneNumber
                                        ) { extractedCountryCode, nationalNumber ->

                                            buyer.cellPhone =
                                                java.lang.Long.valueOf(nationalNumber)
                                                    .toString()

                                            buyer.countryCode = "+$extractedCountryCode"

                                        }

                                        phoneCursor.close()
                                        cursor.close()
                                        completion(buyer)

                                    } catch (e: Exception) {

                                    }
                                }

                            })

                    } else {

                        var phoneNumber = ""
                        while (phoneCursor.moveToNext()) {
                            phoneNumber = phoneCursor.getString(
                                phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                            )
                        }

                        try {

                            parsePhoneNumberFromContacts(
                                activity,
                                phoneNumber
                            ) { extractedCountryCode, nationalNumber ->

                                buyer.cellPhone =
                                    java.lang.Long.valueOf(nationalNumber).toString()

                                buyer.countryCode = "+$extractedCountryCode"

                            }

                            phoneCursor.close()
                            cursor.close()
                            completion(buyer)


                        } catch (e: Exception) {

                        }
                    }
                }
            }
        }
    }
}

I know that it can be complicated to answer related question but any lead will be great to fix that situation.

Stack trace is below :

Fatal Exception: java.lang.NullPointerException: phoneCursor.getString( … ) must not be null at com...business.helpers.utils.ContactHelper.getContactInformation(ContactHelper.kt:71) at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog.resultLauncher$lambda-12(ShareListingSendDialog.kt:734) at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog.$r8$lambda$9BI94Y5eKf3mim33AzjWutfS-bk() at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog$$ExternalSyntheticLambda8.onActivityResult(:4) at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:149) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360) at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271) at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313) at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151) at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134) at androidx.fragment.app.Fragment.performStart(Fragment.java:3026) at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:589) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3079) at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:262) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:510) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:248) at com...ui.layout.modules.listing.activities.listingDetail.ActivityListingDetail.onStart(ActivityListingDetail.kt:469) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433) at android.app.Activity.performStart(Activity.java:7986) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3677) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8167) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

Upvotes: 0

Views: 1045

Answers (1)

Merig
Merig

Reputation: 2011

You seems to have some missing column/data.

I recommend using the safer getStringOrNull variant and handle nullability

phoneCursor.getStringOrNull(
   phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
)?.let {
    contact.phoneNumber = it
}

Upvotes: 0

Related Questions