我看到一个令人困惑的空指针异常,只针对我的 Firebase 实时数据库参考中的一个子项。
Query query = db.getReference("comments/" + eventId).orderByKey();
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This causes a null pointer exception.
Long date = dataSnapshot.child("date").getValue(Long.class);
// ...
}
// ...
}
我设置了一个断点,发现计算以下表达式返回 false。
dataSnapshot.child("date").exists();
调试器显示 dataSnapshot 的以下值:
DataSnapshot { key = c953b8fa-b569-4bc0-9302-3a9b34b22853, value = {0c2fd3e6-e9f1-43ce-a807-06b59e1b00bc={text=this comment is a comment., date=1515593659961, creatorId=gkbZMv2ThMh1xDwKyDP9oUtUIKi2, id=0c2fd3e6-e9f1-43ce-a807-06b59e1b00bc}} }
">date"清楚地出现在快照中,所有其他子项(例如"文本"、"创建者 ID"、"id"(都可以访问。唯一的区别是它们是字符串值,而"date"是长整型。
这怎么可能?
当您对 Firebase 数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果的列表。
这意味着您的代码需要通过循环DataSnapshot.getChildren()
来处理列表:
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
Long date = child.child("date").getValue(Long.class);
// ...
}
// ...
}