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

实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:46