Избегайте вызова метода getLatitude может привести к java.Lang.NullPointerException - PullRequest
0 голосов
/ 16 мая 2019

У меня есть способ показать на карте текущее положение устройства. Я использую 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() );
    }
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

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

0 голосов
/ 16 мая 2019

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

public Task getLastLocation ()
Возвращает самое последнее самое доступное местоположение, доступное в настоящее время.

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

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

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

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

...