'perms.get(Manifest.permission.ACCESS_FINE_LOCATION)' 的拆箱可能会产生 'NullPointerException'

Unboxing of 'perms.get(Manifest.permission.ACCESS_FINE_LOCATION)' may produce '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() 而不是尝试从 params HashMap 中获取 Manifest.permission.ACCESS_FINE_LOCATION 的可能空值。如果需要,请使用以下代码片段:

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