从ArrayList<String>随机获取元素触发IndexOutOfBoundsException问题求助
排查并解决ArrayList随机选取元素的IndexOutOfBoundsException问题
首先看你抛出的异常信息,关键点非常明确:Size: 0,这说明你要取元素的ArrayList完全是空的,连一个元素都没有,这时候你尝试访问索引4,必然会触发越界异常。
问题根源
你在调用ArrayList.get()方法时,目标集合里没有任何元素,同时生成的索引(这里是4)远远超出了空集合的合法索引范围(空集合根本不存在合法索引)。大概率是你要么没给集合添加元素,要么添加元素的代码没被执行到,甚至是执行顺序出错了——比如先执行了取元素的逻辑,再去填充集合。
具体修复步骤
确保集合先被填充元素
先检查你的代码,有没有在调用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");如果没有这段填充元素的代码,集合肯定是空的,根本没法取出任何元素。
安全生成随机索引
就算集合有元素,也别硬写固定索引(比如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())会自动生成符合集合范围的索引,不会出现越界问题。检查代码执行顺序
确认你是不是在填充集合之前就调用了showOperations()?比如在main方法里,先执行operator.showOperations(),之后才给集合添加元素?这种顺序错误也会导致集合为空时尝试取元素的情况。
内容的提问来源于stack exchange,提问作者Adndfd
相关产品推荐
相关产品推荐

