0

我有一种方法可以在地图上显示设备的当前位置。我正在使用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() );
    }
}
4

2 回答 2

0

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

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

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

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

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

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

于 2019-05-16T01:25:35.070 回答
0

正如Red所指出的,如果基础对象为 null,则在引用上调用任何其他方法currentLocation都会抛出 a NullPointerException,这可能是getLastLocation(). IDE 只警告您调用的getLatitude()原因是因为它是第一个currentLocation取消引用它的调用。如果该调用引发异常,则甚至不会进行其他方法调用。如果它不抛出异常,那么其他的也不会。因此,IDE 不需要就它们向您发出警告,因为此时为 null 的对象最终无关紧要。

于 2019-05-16T02:15:53.807 回答