Java向数组指定位置插入元素不缩容出现OutOfBoundsException问题
异常根因分析
- 核心越界点:你创建的
newArray长度为原数组长度+1,后续遍历赋值时用了newArray的长度作为循环上限,当i等于原数组长度时,访问array[i]会超出原数组的下标范围,直接抛出OutOfBoundsException。 - 潜在越界点:未对输入的
position做合法性校验,如果输入的位置小于1、或大于原数组长度+1,会导致前序元素右移的循环里访问负下标或超出下标范围。
修复方案
首先修正赋值逻辑的循环范围,同时增加参数合法性校验,修复后代码如下:
import java.util.Scanner; public class AddElementToSpecificPosition { private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int[] array = arrayDetails(); scanner.nextLine(); System.out.println("Enter the position for the element \r"); int position = scanner.nextInt(); System.out.println("Enter the element \r"); int element = scanner.nextInt(); addElementToSpecificPosition(array, position, element); } // 从用户侧获取数组输入信息 private static int[] arrayDetails() { System.out.println("Enter the length for the array \r"); int length = scanner.nextInt(); scanner.nextLine(); int[] intArray = new int[length]; System.out.println("Enter the numbers for the array \r"); for (int i = 0; i < intArray.length; i++) { intArray[i] = scanner.nextInt(); } return intArray; } // 向指定位置添加元素 private static void addElementToSpecificPosition(int[] array, int position, int element) { // 先校验位置合法性,位置从1开始计数,合法范围是1到原数组长度+1 if (position < 1 || position > array.length + 1) { System.out.println("输入的位置不合法"); return; } int lastIndexValue = array[array.length - 1]; // 元素右移 for (int i = array.length - 1; i > position - 1; i--) { array[i] = array[i - 1]; } array[position - 1] = element; // 创建长度+1的新数组 int[] newArray = new int[array.length + 1]; // 仅遍历原数组的长度,避免访问原数组越界 for (int i = 0; i < array.length; i++) { newArray[i] = array[i]; } // 把原来的最后一位放到新数组末尾 newArray[array.length] = lastIndexValue; // 打印结果 for (int j = 0; j < newArray.length; j++) { System.out.println(newArray[j]); } } }
注意事项
Java中的数组是定长结构,无法直接在原有数组对象上增加长度,所以必须创建新的更长的数组来存储插入后的内容,符合你不缩减原有元素、新增元素的需求。
内容的提问来源于stack exchange,提问作者Chinmay
相关产品推荐
相关产品推荐

