首页 > 解决方案 > 避免方法调用 getLatitude 可能产生 java.Lang.NullPointerException

问题描述

我有一种方法可以在地图上显示设备的当前位置。我正在使用FusedLocationProviderClient,因为它似乎是最准确的。

currentLocation.getLatitude()收到警告:

方法调用可能产生 java.Lang.NullPointerException

我怎样才能避免这种风险?为什么它只与 currentLocation.getLatitude() 而不是相关currentLocation.getLongitude()

private void getDeviceLocation(){
    Log.d(TAG, "getDeviceLocation: getting the devices current location");

    FusedLocationProviderClient mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    try{
        if(mLocationPermissionsGranted){

            final Task location = mFusedLocationProviderClient.getLastLocation();

            location.addOnCompleteListener(task -> {
                if(task.isSuccessful()){
                    Log.d(TAG, "onComplete: found location!");

                    Location currentLocation = (Location) task.getResult();
                    LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());

                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, DEFAULT_ZOOM));

                }else{
                    Log.d(TAG, "onComplete: current location is null");
                }
            });
        }
    }catch (SecurityException e){
        Log.e(TAG, "getDeviceLocation: SecurityException: " + e.getMessage() );
    }
}

标签: javaandroidfusedlocationproviderclient

解决方案


IDE 在显示有关您的代码的信息时可能会很奇怪或被误解,但我向您保证它适用于 getLongitude() 和任何其他实例方法或实例成员的调用,因为位置可以为空。

public Task getLastLocation ()
返回当前可用的最近的最佳位置。

如果某个位置不可用(这种情况应该很少发生),则将返回 null。将返回尊重位置权限的最佳精度。

此方法提供了一种获取位置的简化方法。它特别适合不需要准确位置并且不想为位置更新维护额外逻辑的应用程序。

https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient.html#getLastLocation()

所以即使任务成功,任务的结果也可以为空。这意味着您需要在使用它之前检查位置是否为空。


推荐阅读