从Firebase数据库随机获取电台触发IndexOutOfBoundsException求助
解决Firebase随机获取电台时的IndexOutOfBoundsException异常
问题原因分析
你的异常java.lang.IndexOutOfBoundsException: Index: 0, Size: 0指向很明确:当你调用productIdsList.get(new Random().nextInt(productListSize))时,productIdsList是空的(大小为0),自然无法获取索引0的元素。
可能的触发场景:
- Firebase的
STATIONKEY节点下没有任何子节点,或者你的App没有权限读取该节点数据,导致onDataChange里的循环没往productIdsList添加任何内容。 - 代码中可能存在其他地方意外清空了
productIdsList(从你贴的代码暂时没发现,但可以检查全局变量的操作逻辑)。 - 另外你在内部类里定义了一个多余的
nextInt方法,虽然它没被调用,但容易造成代码混淆,建议直接删掉。
代码修复方案
我给你调整后的代码,既解决了越界问题,也优化了逻辑冗余:
String DATABASE_CHILD = "STATIONS"; String DATABASE_CHILD2 ="STATIONKEY"; ref = db.getReference().child(DATABASE_CHILD2); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { productIdsList.clear(); // 先清空旧数据,避免重复累加 for (DataSnapshot ds : snapshot.getChildren()) { String productId = ds.getKey(); productIdsList.add(productId); } // 先判断列表是否有数据,再执行随机逻辑 int productListSize = productIdsList.size(); if (productListSize <= 0) { // 处理无电台数据的情况,比如给用户提示或打日志 Log.e("RandomStation", "No stations found in STATIONKEY node"); return; } // 生成合法的随机索引 int randomIndex = new Random().nextInt(productListSize); String randomStationKey = productIdsList.get(randomIndex); ref = db.getReference().child(DATABASE_CHILD).child(randomStationKey); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 集合只需要清空一次,避免重复操作 mUrl.clear(); mTITLE.clear(); mDOWN.clear(); mIMAGE.clear(); mUP.clear(); mDESC.clear(); for (DataSnapshot snap : snapshot.getChildren()) { station_items = snap.getValue(Stations_Firebase.class); if (station_items == null) continue; // 防止空数据引发崩溃 String a = station_items.getStation(); String b = station_items.getTag(); String c = station_items.getUrl(); Long d = station_items.getUpvote(); Long e = station_items.getDownvote(); String f = station_items.getImage(); mTITLE.add(a); mDESC.add(b); mUrl.add(c); mUP.add(String.valueOf(d)); mDOWN.add(String.valueOf(e)); mIMAGE.add(f); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 不要忽略取消事件,添加错误日志便于排查 Log.e("RandomStation", "Failed to load station details", error.toException()); } }); } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("RandomStation", "Failed to load station keys", error.toException()); } });
额外检查项
- Firebase数据与权限:
- 登录Firebase控制台,确认
STATIONKEY节点下确实存在Uknradio、bbcradio1等子节点,且每个节点的值为true。 - 检查数据库规则,确保你的App有权限读取
STATIONKEY和STATIONS节点。测试阶段可以临时设置为公开读取(上线务必改回安全规则):{ "rules": { ".read": true, ".write": true } }
- 登录Firebase控制台,确认
- 集合初始化:
- 确认
productIdsList已经被正确初始化(比如List<String> productIdsList = new ArrayList<>();),没有被重复赋值为新的空列表。
- 确认
内容的提问来源于stack exchange,提问作者markharrop
相关产品推荐
相关产品推荐

