我最近在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)
这种情况很少发生,我无法真正查明原因,但我相信与火力事件有关
我有这种方法:
@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失败(出于某种原因),它将停止循环,但如果我相信stacktrace会显示,则不会崩溃的应用程序其他方法调用。
因此,如果我是对的,那么此代码中唯一可能为null的东西是从firebase和dataSnapshot
提供的dataSnapshot.getChildren()
我是这个Firebase API的新手,它们是否可能为null?
我是否需要每次检查report.child('something')
是否为空?
答案 0 :(得分:0)
@NonNull可能不是完全可靠,它不会阻止传递null。
仅在以下情况下包含您的代码,以防止发生datasnapshot
nullpointer
错误
if(dataSnapshot != null && dataSnapshot.exists()){
// write your asyntask code block here
}