# #java #android #nullpointerexception #crashlytics-android #firebase-crash-reporting
Вопрос:
Ниже приведена трассировка стека сбоев firebase для Android, и я не могу определить причину этого сбоя. Это может быть глупый вопрос, но количество сбоев растет, и мне нужно исправить. Что именно означает это == null?
Фатальное исключение: java.lang.Исключение NullPointerException: это == null в com.pure.indosat.care.fragments.buy.BuyPackagesFragment.lambda$parsePackagesCategories$1(BuyPackagesFragment.java:175) в com.pure.indosat.care.fragments.buy.BuyPackagesFragment.lambda$parsePackagesCategories$1$BuyPackagesFragment(BuyPackagesFragment.java:11) в com.pure.indosat.care.fragments.buy.-$$Lambda$BuyPackagesFragment$CcYVviVqJQdnZlEmW30Nw6EKMQA.run(-.java:11) в android.os.Handler.handleCallback(Обработчик.java:883) в android.os.Handler.DispatchMessage(Обработчик.java:100) в android.os.Looper.loop(Петлитель.java:237) в android.app.ActivityThread.main(ActivityThread.java:7948) в java.lang.reflect.Метод.вызов(Method.java) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
Я не получаю никаких сбоев в классе java BuyPackagesFragment, когда я его тестировал. Ниже приведен код в строке № 175 в соответствии с аварией
частные пустые категории синтаксического анализа пакетов(JSONObject JSONObject) {
Handler handler = new Handler();
handler.post(() -> {
Iterator<String> keys = jsonObject.keys();
tabs.clear();
while (keys.hasNext()) {
String key = keys.next();
if (jsonObject.opt(key) instanceof JSONObject) {
JSONObject jsonObject1 = (JSONObject) jsonObject.opt(key);
if (jsonObject1 != null) {
String title = jsonObject1.optString("title");
JSONArray jsonArray = jsonObject1.optJSONArray("categories");
TabInfo item = new TabInfo();
**Line No: 175 : JSONArray categoriesArray = mActivity.getJSONArray(jsonObject1, "categories");**
try {
String id = categoriesArray.length() > 0
? categoriesArray.getJSONObject(0).optString("category_id")
: "";
item.setId(id);
} catch (JSONException e) {
TraceUtils.logException(e);
}
item.setTitle(title);
item.setData(jsonArray);
item.setOrder(jsonObject1.optInt("order"));
tabs.add(item);
}
}
}
Collections.sort(tabs, (z1, z2) -> {
if (z1.getOrder() > z2.getOrder())
return 1;
else if (z1.getOrder() < z2.getOrder())
return -1;
return 0;
});
parseTabsData();
});
}
Здесь я подумал, что «mActivity» может быть нулевым, но если это так, то сбой должен произойти в самом начале в соответствии с кодом.
Если кто-нибудь может сказать мне, что именно это означает this == null, то это было бы полезно.
Спасибо.
public JSONArray getJSONArray(JSONObject jsonObject, String key) {
JSONArray jsonArray = new JSONArray();
if (jsonObject == null || TextUtils.isEmpty(key)) return jsonArray;
try {
if (jsonObject.opt(key) instanceof JSONObject) {
jsonArray.put(jsonObject.optJSONObject(key));
return jsonArray;
}
if (jsonObject.opt(key) instanceof JSONArray) {
jsonArray = jsonObject.optJSONArray(key);
return jsonArray;
}
} catch (Exception e) {
TraceUtils.logException(e);
}
return jsonArray;
}
Комментарии:
1. Поскольку mActivity не равен нулю, по вашему мнению, единственным другим вариантом было бы, чтобы jsonObject1 был равен нулю. Я бы предположил, что, возможно, это было пропущено где-то в вашем коде? Есть ли случай, когда вы можете не инициализировать его каким-либо значением?
2. У меня есть обновленный вопрос. Пожалуйста, убедитесь, что проверка jsonObject1 на нуль уже выполняется, прежде чем переходить к этому блоку. @DanBaruch
3. Возможно ли, что jsonObject1 тогда не содержит «категории»?
4. Функция mActivity.getJsonArray() гарантирует, что мы избежим любых таких нулевых исключений и вместо этого дадим пустой JSONArray. Я также добавил этот код функции.
5. Какая из этих строк 175-я? Не могли бы вы отметить его комментарием к коду, пожалуйста.