Firebase onDataChange может предоставить нулевой параметр?

У меня недавно было запущено одно приложение в Google Play, и я пытаюсь исправить сбои, которые получаю на консоли Google, но есть одно, которое я не могу воспроизвести или идентифицировать источник:

java.lang.NullPointerException: 
  at a.b.c.activity.MainActivity$7.run (MainActivity.java)
  at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
  at java.lang.Thread.run (Thread.java:762)

Это происходит не очень часто, и я не могу точно определить причину, но я считаю, что это связано с событиями firebase.

Есть такой способ:

@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {


                    AsyncTask.SERIAL_EXECUTOR.execute(new Runnable() {
                        @Override
                        public void run() {
                            for (DataSnapshot reports : dataSnapshot.getChildren()) {
                                try {
                                String type = reports.child("type").getValue(String.class);
                                if (type.equals("user"))
                                    facade.reportUser(reports.child("id").getValue(Long.class));
                                else if (type.equals("comment"))
                                    facade.reportComment(reports.child("media_id").getValue(String.class), reports.child("id").getValue(Long.class));
                                else if (type.equals("media"))
                                    facade.reportMedia(reports.child("id").getValue(String.class));
                            } catch (Exception e) {
                                break;

                            }
                            }

                        }
                    });
                }
            }

У меня аналогичные методы, работающие в разных обстоятельствах на MainActivity, но каждый из них запускается firebase (MainActivity не имеет анонимного класса, реализующего Runnable, который не обслуживает firebase)

Дело в том, что может вызвать на нем nullpointer?

Как вы видите, все мои внутренние вызовы заключены в catch(Exception e), поэтому, если мой api выйдет из строя (по какой-либо причине), он просто остановит цикл, но не приведет к сбою приложения, если я считаю, что трассировка стека покажет другие вызовы методов.

Итак, если я прав, единственные вещи, которые могут быть нулевыми в этом коде, - это dataSnapshot, предоставленный firebase, и dataSnapshot.getChildren().

Я очень новичок в этом api firebase, возможно ли, что они нулевые? мне нужно каждый раз проверять, является ли report.child('something') нулевым?

Вы можете найти ответ здесь ссылка на сайт, вам нужно использовать dataSnapshot.exists ()

Vadim Eksler 31.07.2018 09:23

В какой строке кода вы получаете NullPointerException?

Alex Mamo 31.07.2018 12:34

@AlexMamo, стек поступает из отчета консоли google ... поскольку исходный apk запутан, я не могу получить реальную строку, где это происходит ... и поскольку я не мог воспроизвести проблему в своей системе, я не знаю точно, что линия

Rafael Lima 31.07.2018 14:37

Если вы не можете предоставить нам строку, в которой вы получаете эту ошибку, я боюсь, что вы не сможете получить большую помощь.

Alex Mamo 31.07.2018 14:48

@AlexMamo, это не мой выбор, я не могу предоставить информацию, которой у меня нет ... но если вы внимательно прочитаете мой вопрос, вы поймете, что я не хочу знать, как его решить ... я могу сделать простые проверки на нулевые значения или заключить в catch (nullpointerexception)

Rafael Lima 31.07.2018 15:13
0
5
95
1

Ответы 1

Может быть, @NonNull не полностью надежен, это не помешает передаче нуля.

просто включите свой код в условие ниже, чтобы предотвратить ошибку datasnapshotnullpointer

if (dataSnapshot != null && dataSnapshot.exists()){
  // write your asyntask code block here
}

@RafaelLima, хорошо, я обновил ответ, пожалуйста, проверьте.

Nirav Bhavsar 31.07.2018 10:02

просто для ясности, это не тот ответ, который я ищу

Rafael Lima 31.07.2018 10:51

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