Android查询Firebase数据出现println needs a message报错如何解决
问题根本原因
你遇到的java.lang.NullPointerException: println needs a message报错,核心原因是:
Firebase的orderByChild().equalTo()查询返回的DataSnapshot是符合查询条件的所有节点的集合,而非单个Playlist节点。哪怕你确定只有1个Playlist_ID为2的匹配项,也需要先遍历集合拿到单个Playlist节点,再读取子字段Music_ID。你直接对集合快照调用child("Music_ID"),自然找不到对应字段,返回的music_id为null,传入Log方法就触发了空指针异常。
你之前修改为dataSnapshot.child("Music_ID").getValue().toString()依旧报错的原因是,getValue()本身已经是null,直接调用toString()同样会触发空指针。
修复代码
修改onDataChange内的逻辑如下即可:
@Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 先判断是否存在匹配的Playlist数据 if (!dataSnapshot.exists()) { Log.i("Value_id", "无匹配的Playlist数据"); return; } // 遍历查询返回的集合,拿到单个Playlist节点 for (DataSnapshot plistSnapshot : dataSnapshot.getChildren()) { String music_id = plistSnapshot.child("Music_ID").getValue(String.class); // 做空值判断,避免后续操作触发空指针 if (music_id != null) { Log.i("Value_id", music_id); str_musictitle.setText(music_id); } else { Log.i("Value_id", "Music_ID字段为空"); } // 如果确认只有1个匹配项,遍历一次即可跳出循环 break; } }
额外排查点
如果修改后仍未拿到预期数据,可以按以下顺序排查:
- 检查Firebase实时数据库的读权限是否配置正确,默认规则禁止未认证用户读写,临时测试可以将规则设置为允许公开读(上线前务必修改为安全规则)
- 确认数据库中
Playlist_ID字段的类型是数字类型,你查询用的是equalTo(2)(数字匹配),如果数据库中存的是字符串"2",会无法匹配到结果 - 放开你之前注释的
Log.i("Value", dataSnapshot.getValue().toString());代码,直接打印整个查询返回的结构,可以直观确认是否拿到了数据、数据格式是否符合预期
内容的提问来源于stack exchange,提问作者Kayla
相关产品推荐
相关产品推荐

