У меня недавно было запущено одно приложение в 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') нулевым?
В какой строке кода вы получаете NullPointerException?
@AlexMamo, стек поступает из отчета консоли google ... поскольку исходный apk запутан, я не могу получить реальную строку, где это происходит ... и поскольку я не мог воспроизвести проблему в своей системе, я не знаю точно, что линия
Если вы не можете предоставить нам строку, в которой вы получаете эту ошибку, я боюсь, что вы не сможете получить большую помощь.
@AlexMamo, это не мой выбор, я не могу предоставить информацию, которой у меня нет ... но если вы внимательно прочитаете мой вопрос, вы поймете, что я не хочу знать, как его решить ... я могу сделать простые проверки на нулевые значения или заключить в catch (nullpointerexception)
Может быть, @NonNull не полностью надежен, это не помешает передаче нуля.
просто включите свой код в условие ниже, чтобы предотвратить ошибку datasnapshotnullpointer
if (dataSnapshot != null && dataSnapshot.exists()){
// write your asyntask code block here
}
@RafaelLima, хорошо, я обновил ответ, пожалуйста, проверьте.
просто для ясности, это не тот ответ, который я ищу
Вы можете найти ответ здесь ссылка на сайт, вам нужно использовать dataSnapshot.exists ()