firebase onDataChange可以提供空参数吗?

时间:2018-07-31 07:17:53

标签: android firebase firebase-realtime-database nullpointerexception

我最近在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')是否为空?

1 个答案:

答案 0 :(得分:0)

@NonNull可能不是完全可靠,它不会阻止传递null。

仅在以下情况下包含您的代码,以防止发生datasnapshot nullpointer错误

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