我试图在网站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)
答案 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);
}
}
}