You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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());
    } 
});

额外检查项

  1. Firebase数据与权限:
    • 登录Firebase控制台,确认STATIONKEY节点下确实存在Uknradio、bbcradio1等子节点,且每个节点的值为true。
    • 检查数据库规则,确保你的App有权限读取STATIONKEY和STATIONS节点。测试阶段可以临时设置为公开读取(上线务必改回安全规则):
      {
        "rules": {
          ".read": true,
          ".write": true
        }
      }
      
  2. 集合初始化:
    • 确认productIdsList已经被正确初始化(比如List<String> productIdsList = new ArrayList<>();),没有被重复赋值为新的空列表。

内容的提问来源于stack exchange,提问作者markharrop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:38:00