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

Java中ArrayList触发IndexOutOfBoundsException的原因及解决

Java ArrayList IndexOutOfBoundsException 问题解析与解决

问题重现

抛出的异常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2

涉事代码:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> myList = new ArrayList<>();
        myList.add("Apple");
        myList.add("Banana");

        // 尝试访问越界元素
        System.out.println(myList.get(3));

        // 尝试修改不存在的元素
        myList.set(3, "Orange");
    }
}

你已经确认元素添加正确,且通过size()发现列表大小小于要访问的索引,下面针对你的疑问逐一解答:


1. 该异常为何会发生?

ArrayList的索引是从0开始计数的,当前你的列表中有2个元素,有效索引范围是0到1(即size()-1)。

  • get(3)试图读取索引3的位置,但列表中根本没有这个位置的元素
  • set(3, "Orange")的作用是修改已有索引位置的元素,而非新增元素,它同样要求索引必须在有效范围内

当你访问的索引超出[0, size()-1]区间时,JVM就会抛出IndexOutOfBoundsException,明确告知你访问的位置不存在。


2. 如何正确处理动态列表以避免此类错误?

  • 新增元素用add(),而非set():如果是要添加新元素,用add("Orange")直接追加到末尾,或者用add(2, "Orange")插入到指定位置(这个方法要求索引≤当前size,比如当前size是2,索引2是合法的,插入后size变为3)
  • 访问/修改前检查索引范围:在调用get()或set()前,先判断索引是否满足 index >= 0 && index < myList.size()
  • 循环时依赖size()控制边界:遍历列表时不要硬编码索引值,比如:
    for (int i = 0; i < myList.size(); i++) {
        System.out.println(myList.get(i));
    }
    
  • 捕获异常做容错处理:如果无法提前预判索引合法性,可以用try-catch捕获异常,在异常块中处理错误逻辑:
    try {
        System.out.println(myList.get(3));
    } catch (IndexOutOfBoundsException e) {
        System.err.println("索引超出列表范围");
    }
    

3. 是否有更优的方式在访问元素前检查其是否存在?

最直接高效的方式就是直接判断索引范围:

int targetIndex = 3;
if (targetIndex >= 0 && targetIndex < myList.size()) {
    // 安全访问或修改元素
    String element = myList.get(targetIndex);
    myList.set(targetIndex, "New Value");
} else {
    // 处理索引非法的情况
}

这个判断是O(1)时间复杂度,没有额外性能开销。

如果是要判断某个元素是否存在于列表中,可以用myList.contains("Apple"),但这和索引合法性检查是不同场景的需求。

若你想用更优雅的方式处理可能不存在的元素,Java 8+的Optional可以帮你包装结果:

int targetIndex = 3;
Optional<String> optionalElement = (targetIndex >= 0 && targetIndex < myList.size()) 
    ? Optional.of(myList.get(targetIndex)) 
    : Optional.empty();

optionalElement.ifPresent(element -> {
    // 当元素存在时执行逻辑
    System.out.println("元素值:" + element);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:43:21