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

Java:遍历大小不一致的List对象,避免IndexOutOfBoundsException

嘿,这个动态集合遍历的问题我之前踩过坑,太懂那种突然蹦出IndexOutOfBoundsException的崩溃感了!针对你说的Hello.java返回大小不一致的列表(首次2个元素、第二次3个)的场景,给你几个绝对安全的遍历方案:

方案1:用增强for循环(最省心的选择)

这是Java里遍历集合最简洁安全的方式,完全不用手动管索引,底层靠迭代器帮你处理边界,不管列表是2个还是3个元素,都能完整遍历,绝对不会触发越界异常。

代码示例:

// 假设Hello.java里获取列表的方法是getDynamicList()
List<String> dynamicList = Hello.getDynamicList();
for (String item : dynamicList) {
    System.out.println(item);
}
方案2:手动基于当前size遍历(适合需要索引的场景)

如果你必须用到索引值,别写死循环上限,一定要先获取列表当前的实际大小,用这个值作为循环的终止条件:

List<String> dynamicList = Hello.getDynamicList();
// 先拿到当前列表的大小,避免硬编码数字导致越界
int currentSize = dynamicList.size();
for (int i = 0; i < currentSize; i++) {
    System.out.println("索引" + i + "的元素:" + dynamicList.get(i));
}

⚠️ 注意:如果遍历过程中列表大小会被动态修改(比如其他线程在添加/删除元素),这个方法可能还是会有问题,这时候看方案3。

方案3:用Iterator迭代器(支持遍历中安全修改)

如果你的场景不仅是遍历,还需要在遍历过程中修改列表(比如删除元素),直接用迭代器是最安全的,它会维护集合的修改状态,避免异常:

List<String> dynamicList = Hello.getDynamicList();
Iterator<String> iterator = dynamicList.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
    // 如果需要删除当前元素,一定要用迭代器的remove方法,别直接调用list.remove()
    // iterator.remove();
}
方案4:多线程场景用并发安全集合

如果列表是在多线程环境下被动态修改的,那建议直接用CopyOnWriteArrayList替代普通的ArrayList,它在遍历时会使用集合的快照,完全不会因为其他线程的修改触发越界或并发修改异常:

// 假设Hello.java返回的是CopyOnWriteArrayList
CopyOnWriteArrayList<String> dynamicList = Hello.getDynamicList();
for (String item : dynamicList) {
    System.out.println(item);
}

不管你用上面哪种方案,都能满足你的需求:首次运行打印2个元素,第二次运行打印3个元素,全程不会出现IndexOutOfBoundsException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:26:30