尝试调用虚拟方法:空对象引用

时间:2018-08-04 06:50:43

标签: java android firebase google-cloud-firestore

我收到Null Object Reference,退出时应用崩溃。

代码:

 //Get Comments Count
firebaseFirestore.collection("Posts/" + postId + "/Comments").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

        if (!documentSnapshots.isEmpty())
        {
            int count = documentSnapshots.size();
            holder.updateCommentsCount(count);
        }
        else if(documentSnapshots.isEmpty())
        {
            holder.updateCommentsCount(0);
        }
    }
});

错误:

  

尝试在空对象引用上调用虚拟方法'boolean com.google.firebase.firestore.QuerySnapshot.isEmpty()'

3 个答案:

答案 0 :(得分:1)

您的应用因未初始化QuerySnapshot而崩溃,并且为空。

private QuerySnapshot querySnap;

在onCreate中将QuerySnapshot初始化为

querysnap = new QuerySnapshot (this, " ");

编辑:

@NullableQuerySnapshot之前提供Exception,并在其后提供错误回调。

public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
          //          Log.w(TAG, "this is the error", e);
                    return;
                }
        if (!documentSnapshots.isEmpty())
            {

检查弗兰克建议的答案。取消订阅后,这是一个好习惯。

答案 1 :(得分:0)

传递给QuerySnapshot的{​​{1}}可能为空,并且您必须在代码中对此加以防范:

onEvent

public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) { if (documentSnapshots == null || documentSnapshots.isEmpty()) { holder.updateCommentsCount(0); } else { int count = documentSnapshots.size(); holder.updateCommentsCount(count); } } 变为null的原因很可能是您的应用一旦用户注销便失去了对该代码正在观察的特定数据的访问权限。您可能需要先考虑detaching all listeners,然后再退出用户。

答案 2 :(得分:0)

尝试此代码,即可正常使用
我也面临同样的问题并采用这种方法解决。

firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

        if(queryDocumentSnapshots != null){

            if(!queryDocumentSnapshots.isEmpty()){

                int count = queryDocumentSnapshots.size();

                holder.updateLikesCount(count);
            }
            else {
                holder.updateLikesCount(0);
            }


        }
    }
});