实现addBefore()向int数组头部添加元素时出现运行异常的问题
问题分析与修复方案
咱们先聚焦你遇到的异常:java.lang.RuntimeException: Index 1 should have value 11 but instead has 0——这说明调用addBefore后,原本应该在索引1的元素丢失了,变成了数组默认的0值,问题核心出在addBefore方法的逻辑实现上,咱们一步步拆解问题:
现有addBefore的核心问题
- 完全错误的元素迁移逻辑:你创建新数组
b后,把原数组元素放到了b[i+a.length]的位置,这相当于把所有原有元素都移到了新数组的后半段,前半段全是默认的0,完全背离了“头部插入后原有元素后移”的需求。 - 不必要的强制扩容:每次调用
addBefore直接把数组扩容到2倍,应该和add方法保持一致——只有当当前元素数量length等于数组容量a.length时才需要扩容,否则直接在原数组基础上移动元素即可。 - 未同步更新
count变量:add方法里更新了count,但addBefore里完全没处理,可能导致后续依赖count的逻辑出现异常。 - 冗余的
index变量:这个变量在构造函数里没初始化,仅在addBefore里用了一次,而且头部插入的位置固定是0,完全没必要用这个变量,反而容易造成混淆。
修复后的addBefore方法
public void addBefore(int x) { // 先判断是否需要扩容,和add方法逻辑对齐 if (length >= a.length) { int[] b = new int[a.length * 2]; // 把原数组元素复制到新数组的1号索引开始的位置(预留0位给新元素) for (int i = 0; i < length; i++) { b[i + 1] = a[i]; } a = b; } else { // 不需要扩容时,从后往前移动元素,避免覆盖未移动的元素 for (int i = length; i > 0; i--) { a[i] = a[i - 1]; } } // 在头部(索引0)插入新元素 a[0] = x; // 同步更新元素数量和count length++; count++; }
额外的细节优化建议
- 可以直接删除
index变量,它目前没有有效用途,只会增加代码复杂度。 - 你的
set方法边界判断有问题:当前判断i >= a.length,但实际有效的元素索引应该是i >= length(length是当前实际存储的元素数量),超出这个范围的索引即使在数组容量内,也是未使用的无效位置,修复后的set方法:
public void set(int i, int x) { if (i < 0 || i >= length) { throw new ArrayIndexOutOfBoundsException(i); } a[i] = x; }
修改后,addBefore就能正确实现“头部插入新元素,原有元素索引递增1”的需求,也不会再出现元素丢失的异常了。
内容的提问来源于stack exchange,提问作者wildwyvern
相关产品推荐
相关产品推荐

