Сбой странного разбора Android - Попытка вызвать виртуальный метод int java.lang.Integer.intValue()

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

if (mCurrentUser != null && mCurrentUser.containsKey(Constants.TABLE_POINTS)) {
    int points = mCurrentUser.getInt(Constants.TABLE_POINTS) + AppSingleton.sPointsLookupMap.get(pointsKey);
                            mCurrentUser.put(Constants.TABLE_POINTS, points);
                            mCurrentUser.saveInBackground();
}

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

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
at com.titlesource.ts_foodsource.fragments.KitchenFragment$10.done(KitchenFragment.java:654)
at com.titlesource.ts_foodsource.fragments.KitchenFragment$10.done(KitchenFragment.java:649)
at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:115)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

Теперь я обнаружил, что intValue() используется внутри метода getInt() (внутри класса ParseObject):

 public int getInt(String key) {
        Number number = this.getNumber(key);
        return number == null?0:number.intValue();
    }

Почему я получаю это исключение. Я перепробовал все. Добавлены нулевые проверки, а также проверено, что поле действительно присутствует в объекте mCurrentUser, но все напрасно.

Если вы проголосовали против этого вопроса, пожалуйста, оставьте причину.

3 ответа

Решение

У вас есть Integer который является нулевым, который вы пытаетесь распаковать (делая простой int от него).

Так как getInt(String key) метод ParseObject уже проверяет, является ли оно нулевым, исключение там не происходит.

Вместо этого это будет в AppSingleton.sPointsLookupMap.get(pointsKey)Таким образом, вы пытаетесь получить объект с карты, которая не существует.

Убедитесь, что он существует, или добавьте правильную обработку ошибок в эту часть кода.

Замените ваш код следующим:

if (mCurrentUser != null && mCurrentUser.containsKey(Constants.TABLE_POINTS)) {
    int points = mCurrentUser.getInt(Constants.TABLE_POINTS);
    Integer theOtherVariable = AppSingleton.sPointsLookupMap.get(pointsKey);
    if (theOtherVariable != null)
        points += theOtherVariable;
    mCurrentUser.put(Constants.TABLE_POINTS, points);
    mCurrentUser.saveInBackground();
}

Это должно решить проблему и сделать код исключительным:-)

Первая строка (после if) сделала что-то вроде этого:

  1. Вы создаете points переменная
  2. Вы назначаете mCurrentUser.getInt(Constants.TABLE_POINTS) ценность для него
  3. Вы получаете Integer объект с AppSingleton.sPointsLookupMap.get(pointsKey)
  4. Вы добавляете полученный объект Integer к points, получив его значение с .intValue() вызов.

Все это произошло за кулисами в этой одной строке кода и, если получено Integer объект был нулевым, Exception был брошен.

У меня только что возникла ошибка, поэтому я здесь. Как сказано в принятом ответе, код пытается распаковатьInteger к int. И выйдет из строя, если он NULL

мой код был:

private Integer age_limit;

// ...

public int getAge_limit() {
    return age_limit;
  }

так изменил это на это

public Integer getAge_limit() {
    return age_limit;
  }

Никогда не знал, что это возможно (разные типы данных без предупреждений).

Иногда это может случиться, когда вы передаете массив типа Integer без final ключевое слово для анонимного внутреннего класса (для OnClickListener в моем случае).

Другие вопросы по тегам