Android Mystery NullPointerException получает последнее известное местоположение - PullRequest
1 голос
/ 08 августа 2011

Я получаю исключение NullPointerException в одном из моих приложений. Я думал, что я учитываю все места в этом фрагменте кода для ссылок Null, но, похоже, я что-то упустил. Я просматривал код насквозь, но я все еще не уверен, откуда выбрасывается это исключение NullPointerException.

Это ошибка, о которой сообщил пользователь, поэтому я не могу отладить, и я никогда не получал эту ошибку во время разработки

Что происходит в коде / приложении:

Пользователь запускает приложение, и я пытаюсь узнать его последнее известное местоположение по сети или по GPS. Как только я установлю местоположение, если оно будет доступно, я позже получу погоду для этого местоположения и покажу его пользователю.

Кто-нибудь знает, где в этом коде может произойти сбой? Есть ли какие-то дополнительные проверки для GPS / NETWORK, которые я должен делать? Любая помощь очень ценится!

Трассировка стека

java.lang.NullPointerException
at com.hookedroid.fishingcompanion.BaseActivity.getLastKnownLocation(BaseActivity.java:337)
at com.hookedroid.fishingcompanion.BaseActivity.getWeatherbyCurrent(BaseActivity.java:164)
at com.hookedroid.fishingcompanion.BaseActivity.getWeather(BaseActivity.java:138)
at com.hookedroid.fishingcompanion.MainFish.syncWeather(MainFish.java:214)
at com.hookedroid.fishingcompanion.MainFish.run(MainFish.java:206)
at java.lang.Thread.run(Thread.java:1019)

Код проблемы

// Gets the user's current NETWORK/GPS location
// then gets weather for that location
private void getWeatherbyCurrent() throws WeatherException {
    Criteria criteria = new Criteria();
    locationProvider = locManager.getBestProvider(criteria, true);

    // Error is thrown on this method call
    getLastKnownLocation();

    getLocationBasedWeather();
}

public void getLastKnownLocation() throws WeatherException {
    String provider;
    //Check if NETWORK Provider is enabled.  If enabled, get it's last known location.
    //If location is received, set baseLocation and return back to get weather.
    //If location is not received, continue on and try to get location from GPS Provider.
    if (isNetworkProviderEnabled()) {
        provider = LocationManager.NETWORK_PROVIDER;
        baseLocation = locManager.getLastKnownLocation(provider);
        // This is Line 337.  I had removed it from the posted code as it was unused
        // and didn't think it was causing an issue.  
        long fixTime = baseLocation.getTime();

        //Location returned from NETWORK_PROVIDER, return/stop executing code and get weather for this location
        if (baseLocation != null)
            return;
    }
    if (baseLocation == null && isGPSEnabled()) {
        provider = LocationManager.GPS_PROVIDER;
        baseLocation = locManager.getLastKnownLocation(provider);
    }
    else {
        if (locationProvider == null) {
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_COARSE);
            locationProvider = locManager.getBestProvider(criteria, true);
        }

        if (locationProvider != null)
            baseLocation = locManager.getLastKnownLocation(locationProvider);
        else {
            if (!isGPSEnabled && !isNetworkProviderEnabled)
                throw new WeatherException("No Location Providers are available.");
        }
    }
}
//Returns whether or not the NETWORK_PROVIDER is enabled
public boolean isNetworkProviderEnabled() {
    checkNetworkProvider();
    return this.isNetworkProviderEnabled;
}

//Check if the NETWORK_PROVIDER is enabled
public void checkNetworkProvider() {
    isNetworkProviderEnabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
//Returns whether or not the GPS_PROVIDER is enabled
public boolean isGPSEnabled() {
    checkGPS();
    return this.isGPSEnabled;
}
//Check if the GPS_PROVIDER is enabled
public void checkGPS() {
    isGPSEnabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

Ответы [ 3 ]

0 голосов
/ 08 августа 2011

Я не видел, где вы регистрируетесь для обновления местоположения?Может быть, это то, чего вам не хватает здесь.

0 голосов
/ 08 августа 2011

Я случайно удалил строку из своего кода перед публикацией, так как думал, что это просто строка неиспользуемого кода. Это, однако, вызывает проблему. В следующей строке baseLocation будет равно нулю, если NETWORK_PROVIDER отключен пользователем.

long fixTime = baseLocation.getTime();

Исправление: не пытайтесь вызывать метод getTime () для объекта местоположения Null :) Спасибо всем!

0 голосов
/ 08 августа 2011

Без лишнего анализа вашего кода это может быть проблема с разрешениями?Может быть, вашему приложению не разрешено использовать данные GPS, что вызывает непредвиденную ошибку?

-Woody

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...