Избегайте вызова метода 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() );
    }
}

person Stefano    schedule 15.05.2019    source источник


Ответы (2)


IDE могут быть странными или неправильно истолкованными, когда они отображают информацию о вашем коде, но я уверяю вас, что это относится к getLongitude() и любому другому вызову методов экземпляра или членов экземпляра, потому что местоположение может быть нулевым.

public Task getLastLocation ()
Возвращает лучшее из последних доступных местоположений.

Если местоположение недоступно, что должно происходить очень редко, будет возвращено значение null. Будет возвращена наилучшая доступная точность при соблюдении разрешений местоположения.

Этот метод обеспечивает упрощенный способ получения местоположения. Он особенно хорошо подходит для приложений, которым не требуется точное местоположение и которые не хотят поддерживать дополнительную логику для обновлений местоположения.

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

Таким образом, даже если задача выполнена успешно, результат задачи может быть нулевым. Все это означает, что вам нужно проверить, является ли местоположение нулевым, прежде чем использовать его.

person Red    schedule 16.05.2019

Как указал Red, вызов любых других методов по ссылке currentLocation вызовет NullPointerException, если базовый объект имеет значение null, что является возможный результат getLastLocation(). Причина, по которой IDE предупреждает вас только о вызове getLatitude(), заключается в том, что это первый вызов currentLocation, который разыменовывает его. Если этот вызов выдает исключение, то вызовы других методов даже не будут выполняться. Если он не выдает исключение, то и остальные тоже. Следовательно, IDE не нужно предупреждать вас о них, потому что объект, равный нулю, в конечном итоге не будет иметь значения в этот момент.

person Hei2    schedule 16.05.2019