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

使用ArrayList实现斐波那契第N项时触发数组越界异常,求原因及解决办法

问题分析与解决:用ArrayList实现斐波那契数列时的IndexOutOfBoundsException

异常产生的原因

  1. 直接触发越界的问题:当输入x>=2时,不管循环是否执行,最后都会执行return arr.get(x)。但初始化后的ArrayList只有索引0和1(对应第0、1项),比如x=2时,循环条件i<x(即i<2)不成立,循环根本没运行,直接去拿索引2的元素——此时列表长度仅为2,最大索引是1,自然抛出索引越界异常。
  2. 循环逻辑的漏洞:就算x>2,比如x=3,循环条件i<x会让i只执行到2,循环结束后ArrayList里只有索引0、1、2的元素,但最后return的是arr.get(3),依然超出了列表的最大索引(此时列表长度为3,最大索引是2)。
  3. 冗余操作:循环里先arr.add(i, valueOfTerm)再arr.set(i, valueOfTerm)完全没必要,add已经把元素放到索引i的位置了,后续set属于重复操作,纯粹浪费性能。

解决建议

方案1:修正ArrayList实现的逻辑

调整循环终止条件,优化ArrayList的使用方式:

public static Integer NacciTerm(int x) {
    ArrayList<Integer> arr = new ArrayList<>();
    arr.add(0); // 第0项
    arr.add(1); // 第1项

    if (x == 0 || x == 1) {
        System.out.println(arr.get(x));
        return arr.get(x);
    }

    // 循环从2到x,确保计算并添加到第x项
    for (int i = 2; i <= x; i++) {
        int value = arr.get(i-1) + arr.get(i-2);
        arr.add(value); // 直接在末尾添加,ArrayList自动处理扩容,无需指定索引
    }

    System.out.println(arr.get(x));
    return arr.get(x);
}

关键改进:

  • 去掉指定索引的add操作,直接用arr.add(value)在列表末尾追加,既符合ArrayList的设计初衷,又避免了索引操作的风险。
  • 循环条件改为i <= x,确保计算到第x项,这样arr.get(x)就不会越界。
  • 在if分支里直接return,避免后续代码的无效执行。

方案2:更高效的迭代实现(无需ArrayList)

斐波那契数列不需要存储所有中间项,用两个变量迭代即可,内存占用更低:

public static Integer NacciTerm(int x) {
    if (x == 0) return 0;
    if (x == 1) return 1;

    int prevPrev = 0;
    int prev = 1;
    int current = 0;

    for (int i = 2; i <= x; i++) {
        current = prevPrev + prev;
        prevPrev = prev;
        prev = current;
    }

    System.out.println(current);
    return current;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:15:16