Сбой странного разбора 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) сделала что-то вроде этого:
- Вы создаете
points
переменная - Вы назначаете
mCurrentUser.getInt(Constants.TABLE_POINTS)
ценность для него - Вы получаете
Integer
объект сAppSingleton.sPointsLookupMap.get(pointsKey)
- Вы добавляете полученный объект 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 в моем случае).