将'perms.getManifest.permission.ACCESS_FINE_LOCATION'拆箱可能会产生'NullPointerException'

问题描述

将项目更新到最新版本30(buildToolsversion“ 30.0.2”)后,我看到此警告。 如何解决此警告?

onRequestPermissionsResult代码如下::

switch (requestCode) {
            case LOCATION_PERMISSION_REQUEST_CODE: {

                Map<String,Integer> perms = new HashMap<>();

                perms.put(Manifest.permission.ACCESS_FINE_LOCATION,PackageManager.PERMISSION_GRANTED);

                // Fill with actual results from user
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i++)
                        perms.put(permissions[i],grantResults[i]);

                    if ((perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                    ) {
                        // do some task
                    } else {

                        if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
                            showDialogoK(getResources().getString(R.string.some_req_permissions));
                        } else {
                            explain(getResources().getString(R.string.open_settings));
                        }
                    }
                }
            }
            break;

            default:
                break;
        }

解决方法

根据自动装箱和拆箱的official docs,将包装类型(Integer)的对象转换为其对应的原始(int)值称为拆箱。当您尝试将可能为null的值取消装箱时,会出现此警告,提示可能为NullPointerException。

要摆脱此警告,使用getInt()代替get()应该会有所帮助。您也可以在值上添加一个空检查。

根据编辑中提供的代码,使用ActivityCompat.checkSelfPermission()而不是尝试从Manifest.permission.ACCESS_FINE_LOCATION的HashMap中获取params的可能的空值。如果需要,请使用以下代码段:

if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
  // do some task
} else {
  ...
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...