【问题标题】:firebase onDataChange can provide null parameter?firebase onDataChange 可以提供空参数吗?
【发布时间】:2018-07-31 07:17:52
【问题描述】:

我最近在 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 失败(出于任何原因)它只会停止循环,但如果我相信堆栈跟踪会显示其他方法,它不会使应用程序崩溃来电。

因此,如果我是对的,那么此代码中唯一可能为空的内容是 firebase 提供的 dataSnapshotdataSnapshot.getChildren()

我是这个 firebase api 的新手,它们有可能是空的吗? 如果report.child('something') 为空,我是否需要每次检查?

【问题讨论】:

  • 你可以在这里找到答案link你需要使用dataSnapshot.exists()
  • 你在哪一行代码得到NullPointerException
  • @AlexMamo,堆栈来自谷歌控制台的报告......由于原始 apk 被混淆了,我无法得到它发生的真实线路......因为我无法重现问题在我的系统中,我不知道哪一行是
  • 如果您无法向我们提供您遇到该错误的行,我担心您无法获得太多帮助。
  • @AlexMamo,这不是我的选择,我无法提供我没有的信息......但如果你仔细阅读我的问题,你就会明白我不想知道如何解决它...我可以对空值进行简单检查或包含在 catch(nullpointerexception) 中

标签: android firebase firebase-realtime-database nullpointerexception


【解决方案1】:

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

只需在以下条件中包含您的代码,以防止出现datasnapshot nullpointer 错误

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

【讨论】:

  • @RafaelLima,好的,我已经更新了答案,请检查。
  • 澄清一下,这不是我要找的答案