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

Java二维ArrayList无序指定索引添加元素触发异常原因

为什么ArrayList指定索引添加元素时跳索引会抛出IndexOutOfBoundsException?

核心原因

ArrayList的add(int index, E element)方法不允许跳空索引添加元素——它是基于动态数组实现的有序集合,并非稀疏数组,不会自动填充中间的空位。调用该方法时,传入的索引必须满足 0 ≤ index ≤ 当前集合的size,否则直接触发IndexOutOfBoundsException。

结合你的代码分析

正常运行的场景

  • 执行frisbeTeams.add(0,avocado)后,frisbeTeams的size变为1;
  • 接着add(1,zen),此时索引1等于当前size(1),符合规则,元素被追加到末尾;
  • 最后add(2,szupa),索引2等于当前size(2),同样合法,元素正常追加。

报错的场景

  • 执行frisbeTeams.add(0,avocado)后,frisbeTeams的size是1;
  • 此时调用add(2,zen),传入的索引2大于当前size(1),违反了方法的索引校验规则,直接触发rangeCheckForAdd方法的范围检查,抛出异常。

源码层面的验证

从报错信息可以看到,异常来自ArrayList.rangeCheckForAdd方法,它的核心校验逻辑非常直白:

private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

只要索引超过当前集合的size,就会抛出异常。

解决思路

如果需要按指定索引存储子列表且允许跳索引,推荐使用Map<Integer, ArrayList<String>>,用键表示索引,值存储对应子列表,无需顾虑索引连续性:

Map<Integer, ArrayList<String>> frisbeTeams = new HashMap<>();
frisbeTeams.put(0, avocado);
frisbeTeams.put(2, zen);
frisbeTeams.put(1, szupa);

如果必须使用List结构,只能先填充中间空位(比如添加null占位),再替换对应位置的元素:

ArrayList<ArrayList<String>> frisbeTeams = new ArrayList<>();
frisbeTeams.add(0, avocado);
// 填充索引1的空位
frisbeTeams.add(1, null);
frisbeTeams.add(2, zen);
// 替换索引1的元素
frisbeTeams.set(1, szupa);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:24