使用ArrayList实现斐波那契第N项时触发数组越界异常,求原因及解决办法
问题分析与解决:用ArrayList实现斐波那契数列时的IndexOutOfBoundsException
异常产生的原因
- 直接触发越界的问题:当输入
x>=2时,不管循环是否执行,最后都会执行return arr.get(x)。但初始化后的ArrayList只有索引0和1(对应第0、1项),比如x=2时,循环条件i<x(即i<2)不成立,循环根本没运行,直接去拿索引2的元素——此时列表长度仅为2,最大索引是1,自然抛出索引越界异常。 - 循环逻辑的漏洞:就算x>2,比如x=3,循环条件
i<x会让i只执行到2,循环结束后ArrayList里只有索引0、1、2的元素,但最后return的是arr.get(3),依然超出了列表的最大索引(此时列表长度为3,最大索引是2)。 - 冗余操作:循环里先
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
相关产品推荐
相关产品推荐

