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

动态数组pop方法报错:ArrayIndexOutOfBoundsException问题咨询

解决动态数组pop方法的越界报错与长度问题

嘿,我来帮你搞定这个动态数组的pop方法问题!咱们一步步拆解问题,然后给出修复方案。

首先分析报错原因

你遇到的ArrayIndexOutOfBoundsException: 100,根源就是这句代码:

data[data.length] = 0;

Java数组的索引范围是从0到data.length-1,data.length对应的位置根本不存在,直接触发了数组越界异常,这行代码完全没必要,必须删掉。

然后解决“移除代码后数组长度未改变”的问题

你说删掉那句后数组长度没变化,其实是你的pop方法逻辑有几个问题:

  1. 你的length()方法返回的是size变量,但你的pop方法虽然做了size--,却错误地返回了data.length(而不是用来表示数组实际元素个数的size)
  2. 没有维护index变量的一致性:push时你用index++记录下一个插入位置,pop时也需要把index减1,否则下次push会写到错误的位置
  3. pop方法的语义应该是移除最后一个元素并返回它,而不是返回数组长度

修复后的完整pop方法

这里给你修正后的pop方法,加上必要的健壮性判断,同时修正逻辑:

public int pop() {
    // 先判断数组是否为空,避免空操作报错
    if (size == 0) {
        throw new IllegalStateException("数组为空,无法执行pop操作");
    }
    // 获取要弹出的最后一个元素(index-1是最后一个元素的索引,因为index指向下一个插入位置)
    int poppedElement = data[index - 1];
    // 将数组复制为长度减1的新数组
    data = Arrays.copyOf(data, data.length - 1);
    // 同步调整size和index
    size--;
    index--;
    // 返回弹出的元素,符合pop方法的语义
    return poppedElement;
}

另外,建议你在构造函数里显式初始化size和index,避免默认值带来的潜在问题:

public DynamicArray(int size) {
    this.data = new int[size];
    this.size = 0; // 初始元素个数为0
    this.index = 0; // 初始插入位置为0
}

测试验证

修改后,在main方法里添加两行打印验证:

a.pop();
System.out.println(a.length()); // 应该输出99
System.out.println(a.select(98)); // 应该输出99(原来的第100个元素被弹出,现在最后一个是99)

这样就能看到数组的实际元素个数已经正确减少了。

关键要点总结

  • 永远不要访问array.length对应的索引,这是数组的边界外位置
  • 动态数组的size(实际元素个数)和index(下一个插入位置)要保持同步更新
  • pop方法的核心是移除最后一个元素并返回它,而不是修改数组长度后返回长度

内容的提问来源于stack exchange,提问作者user9160725

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:06