迭代DataSnapshot时出现Firebase ClassCastException

时间:2014-07-13 14:48:08

标签: java firebase

我试图在网站they recomend to post a question here instead中向Firebase小组报告错误。

我使用最新的Java SDK来监听节点更改事件。在迭代DataSnapshot对象时,下面的异常会打击

请注意,错误位于库内,而不在我的代码中。

代码:

        void printData(DataSnapshot data) {
            System.out.println(data.getName() + ":" + data.getValue());
            Iterator<DataSnapshot> it = data.getChildren().iterator();
            while (it.hasNext()) {
                DataSnapshot dataSnapshot = (DataSnapshot) it.next();
                printData(dataSnapshot);
            }
        }

数据:

onChildAdded
-e42170ec-a44f-4dcf-9d18-76a39165cea7:{ts=1405260544422, rating=2}
--rating:2

异常堆栈跟踪:

Exception in thread "FirebaseEventTarget" java.lang.ClassCastException: com.firebase.client.snapshot.LongNode cannot be cast to com.firebase.client.snapshot.ChildrenNode
    at com.firebase.client.DataSnapshot.getChildren(DataSnapshot.java:273)
    at Read$1.printData(Read.java:54)
    at Read$1.onChildAdded(Read.java:39)
    at com.firebase.client.core.ChildListenerContainer$1.run(ChildListenerContainer.java:49)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)

1 个答案:

答案 0 :(得分:6)

感谢您的举报!很抱歉,看起来确实是一个错误,它应该返回一个空的迭代器而不是抛出异常。我将在客户端的下一个版本中修复此问题。关注@FirebaseRelease关于客户端版本的通知。

与此同时,您可以通过在使用hasChildren()方法调用getChildren()之前首先检查DataSnapshot实例是否具有子项来防止这种情况。所以你的printData方法可能如下所示:

    void printData(DataSnapshot data) {
        System.out.println(data.getName() + ":" + data.getValue());
        if (data.hasChildren()) {
            Iterator<DataSnapshot> it = data.getChildren().iterator();
            while (it.hasNext()) {
                DataSnapshot dataSnapshot = (DataSnapshot) it.next();
                printData(dataSnapshot);
            }
        }
    }