Как определить причину сбоя this == null с предоставленной трассировкой стека в firebase в приложении для Android?

# #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-я? Не могли бы вы отметить его комментарием к коду, пожалуйста.