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

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]

根因说明

  1. Java数组是定长结构:初始化int []arr={1,2,3,4,5,6}时,数组长度固定为6,合法下标范围是0~5。移位循环第一次执行时i=size-1=5,执行arr[i+1] = arr[i]需要访问下标6,超出数组合法下标范围,直接触发越界异常。
  2. C++版本可运行不代表逻辑正确:C++原生数组不做内置边界检查,越界写入内存属于未定义行为,只是运行时刚好没触发崩溃,本质是非法的内存操作。
  3. 传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:39:29