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

从ArrayList<String>随机获取元素触发IndexOutOfBoundsException问题求助

排查并解决ArrayList随机选取元素的IndexOutOfBoundsException问题

首先看你抛出的异常信息,关键点非常明确:Size: 0,这说明你要取元素的ArrayList完全是空的,连一个元素都没有,这时候你尝试访问索引4,必然会触发越界异常。

问题根源

你在调用ArrayList.get()方法时,目标集合里没有任何元素,同时生成的索引(这里是4)远远超出了空集合的合法索引范围(空集合根本不存在合法索引)。大概率是你要么没给集合添加元素,要么添加元素的代码没被执行到,甚至是执行顺序出错了——比如先执行了取元素的逻辑,再去填充集合。

具体修复步骤

  1. 确保集合先被填充元素
    先检查你的代码,有没有在调用showOperations()方法之前,给ArrayList添加过目标字符串?比如像下面这样:

    // 可以在Launcher的main方法里,或者Operator的初始化逻辑中
    ArrayList<String> operations = new ArrayList<>();
    // 添加你需要的操作字符串
    operations.add("3 add 4");
    operations.add("7 sub 1");
    operations.add("2 mul 5");
    

    如果没有这段填充元素的代码,集合肯定是空的,根本没法取出任何元素。

  2. 安全生成随机索引
    就算集合有元素,也别硬写固定索引(比如4),要根据集合的实际大小生成合法的随机索引,同时先判断集合是否为空,提前规避异常场景:

    public void showOperations() {
        // 先判断集合是否为空,提前处理异常情况
        if (operations.isEmpty()) {
            System.out.println("操作集合为空,请先添加元素!");
            return;
        }
        Random random = new Random();
        // 用集合的size()生成0到size()-1之间的随机数,这才是合法的索引范围
        int randomIdx = random.nextInt(operations.size());
        String randomOp = operations.get(randomIdx);
        System.out.println(randomOp);
    }
    

    这里random.nextInt(operations.size())会自动生成符合集合范围的索引,不会出现越界问题。

  3. 检查代码执行顺序
    确认你是不是在填充集合之前就调用了showOperations()?比如在main方法里,先执行operator.showOperations(),之后才给集合添加元素?这种顺序错误也会导致集合为空时尝试取元素的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:25:26