Java数组指定位置插入元素时抛出下标越界异常问题排查
数组插入元素触发下标越界异常问题
问题复现
执行数组指定位置插入元素逻辑时抛出下标越界错误,相关实现代码如下:
import java.util.Arrays; import java.lang.String; public class Adding_elements_Array{ static void add(int []arr,int element,int index,int size){ for(int i=size-1;i>=index;i++){ arr[i+1]=arr[i]; } arr[index]=element; } public static void main(String[] args){ int []arr={1,2,3,4,5,6}; int size=6; int element=7,index=2; add(arr,element,index,size); size+=1; System.out.println(Arrays.toString(arr)); } }
运行时抛出的异常信息:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6 at Adding_elements_Array.add(Adding_elements_Array.java:6) at Adding_elements_Array.main(Adding_elements_Array.java:14)
已知现象
- 初始化数组长度为6,多次调整参数后仍抛出相同异常
- 相同逻辑用C++实现可运行,Java环境下执行失败
- 传入size参数为5时程序可执行,但会直接覆盖下标为2的原有元素
3,不会执行元素后移移位 - 程序预期输出结果:
[1,2,7,3,4,5,6]
根因说明
- Java数组是定长结构:初始化
int []arr={1,2,3,4,5,6}时,数组长度固定为6,合法下标范围是0~5。移位循环第一次执行时i=size-1=5,执行arr[i+1] = arr[i]需要访问下标6,超出数组合法下标范围,直接触发越界异常。 - C++版本可运行不代表逻辑正确:C++原生数组不做内置边界检查,越界写入内存属于未定义行为,只是运行时刚好没触发崩溃,本质是非法的内存操作。
- 传入size=5时结果不符合预期:传入的size和数组实际长度不匹配,移位循环只会从下标4开始移动元素,没有移动最后一个下标为5的元素,移位不完整,最终赋值时就会出现元素覆盖的问题。
修复方案
Java中定长数组无法直接扩容插入元素,要实现插入后长度+1的效果,正确做法是插入时创建长度为原数组长度+1的新数组,完成元素拷贝和插入后返回新数组,修复后的代码如下:
import java.util.Arrays; public class Adding_elements_Array{ static int[] add(int []arr,int element,int index){ // 校验插入下标合法性 if(index < 0 || index > arr.length){ throw new IllegalArgumentException("插入下标超出合法范围"); } // 创建长度+1的新数组 int[] newArr = new int[arr.length + 1]; // 拷贝插入位置前的元素 for(int i = 0; i < index; i++){ newArr[i] = arr[i]; } // 写入待插入元素 newArr[index] = element; // 拷贝插入位置后的元素 for(int i = index; i < arr.length; i++){ newArr[i+1] = arr[i]; } return newArr; } public static void main(String[] args){ int []arr={1,2,3,4,5,6}; int element=7,index=2; arr = add(arr,element,index); System.out.println(Arrays.toString(arr)); } }
运行上述代码即可得到预期输出[1, 2, 7, 3, 4, 5, 6]。
内容的提问来源于stack exchange,提问作者Novice
相关产品推荐
相关产品推荐

