Android Studio 错误java.lang.空指针异常:尝试获取com.example.watch.许可活动.onCreate(许可活动.kt:42)处的空数组的长度

uqcuzwp8  于 2023-01-13  发布在  Android
关注(0)|答案(2)|浏览(98)
package com.example.watch

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.fragment.app.FragmentActivity
import java.util.*

class PermissionActivity : FragmentActivity() {
    private var mPermissions: ArrayList<String?>? = null
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        finish()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mPermissions = if (savedInstanceState != null) {
            savedInstanceState.getStringArrayList(PERMISSION_KEY)
        } else {
            ArrayList(Arrays.asList(*intent.getStringArrayExtra(PERMISSION_KEY)))
        }
        Log.i(TAG, "onCreate()")
        requestPermission()
    }

    fun requestPermission() {
        val it = mPermissions!!.iterator()
        while (it.hasNext()) {
            if (ActivityCompat.checkSelfPermission(
                    this,
                    it.next()!!
                ) == PackageManager.PERMISSION_GRANTED
            ) {
                it.remove()
            }
        }
        if (mPermissions!!.isEmpty()) { // all allowed
            setResult(RESULT_OK)
            Log.i(TAG, "finished")
            finish()
        } else {
            var permissions: Array<String?>? = arrayOfNulls(
                mPermissions!!.size
            )
            permissions = mPermissions!!.toArray(permissions)
            ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQ_TAG)
            Log.i(TAG, "requestPermissions")
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putStringArrayList(PERMISSION_KEY, mPermissions)
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        Log.i(TAG, "onRequestPermissionsResult() requestCode = " + "requestCode")
        if (requestCode == PERMISSION_REQ_TAG) {
            if (permissions.size == 0) {
                Log.i(TAG, "onRequestPermissionsResult : permission is 0")
                return
            }
            for (p in grantResults) {
                if (p == PackageManager.PERMISSION_DENIED) {
                    Log.i(TAG, "onRequestPermissionsResult : permission denied")
                    finish()
                    return
                }
            }
            setResult(RESULT_OK)
            finish()
        }
    }

    companion object {
        private val TAG = PermissionActivity::class.java.simpleName
        private const val PERMISSION_KEY = "permissions"
        private const val PERMISSION_REQ_TAG = 1
        fun checkPermission(context: Context?, permissions: Array<String>): Boolean {
            for (permission in permissions) {
                if (context == null || ActivityCompat.checkSelfPermission(
                        context,
                        permission!!
                    ) == PackageManager.PERMISSION_DENIED
                ) {
                    Log.i(TAG, "checkPermission : PERMISSION_DENIED : " + "permission")
                    return false
                } else {
                    Log.i(TAG, "checkPermission : PERMISSION_GRANTED : " + "permission")
                }
            }
            return true
        }

        fun showPermissionPrompt(
            callingActivity: Activity,
            requestCode: Int,
            permissions: Array<String>
        ) {
            val intent = Intent(callingActivity, PermissionActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
            intent.putExtra(PERMISSION_KEY, permissions)
            callingActivity.startActivityForResult(intent, requestCode)
        }
    }
}

代码如上所示,错误为:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.watch, PID: 32569
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.watch/com.example.watch.PermissionActivity}: java.lang.NullPointerException: Attempt to get length of null array
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3456)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3612)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2073)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:7690)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
     Caused by: java.lang.NullPointerException: Attempt to get length of null array
        at com.example.watch.PermissionActivity.onCreate(PermissionActivity.kt:42)
        at android.app.Activity.performCreate(Activity.java:8033)
        at android.app.Activity.performCreate(Activity.java:8013)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3429)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3612) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2073) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.app.ActivityThread.main(ActivityThread.java:7690) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995) 
I/Process: Sending signal. PID: 32569 SIG: 9

请帮助我尝试通过此代码给予权限,但收到java.lang.NullPointerException错误:尝试在com.example.watch.PermissionActivity.onCreate(PermissionActivity.kt:42)中获取空数组的长度。要运行这段代码,我应该做哪些更改

rqcrx0a6

rqcrx0a61#

您正在使用mPermissions!!.size,并且mPermissions似乎为null,您应该进行调试以检查其为null的原因。另外,请尝试避免使用!!,而是使用if语句或作用域函数执行null检查

sxpgvts3

sxpgvts32#

根据堆栈跟踪,出错的行似乎是if (mPermissions!!.isEmpty())。正如Kotlindocs在这里所述,!!操作符是为NPE爱好者准备的,应该避免使用。因为它似乎只是试图检查权限数组是否为空,所以可以使用mPermissions.isNullOrEmpty()

相关问题