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

数组排序后匹配原数组索引时出现IndexOutOfBoundException的原因

导致IndexOutOfBoundException的常见原因(无对象/集合场景)

1. 重复薪资值引发的索引处理错误

如果你的员工薪资存在重复值,而示例用的是唯一薪资数据,就会触发这个问题。
比如你用Arrays.binarySearch()查找排序后empPay元素在tempPay中的索引时,当目标值重复,该方法返回的是任意匹配的索引,甚至可能返回负数(表示插入点,而非有效索引)。如果直接把这个负数当作索引使用,或者未处理重复值导致遍历越界,就会抛出异常。
举个例子:
原tempPay数组:[3500, 5000, 5000, 4200]
排序后empPay数组:[3500, 4200, 5000, 5000]
当查找第二个5000时,binarySearch可能返回-4(插入点位置),直接用tempPay[-4]必然越界。而示例中无重复值,binarySearch始终返回有效正索引,不会出错。

2. 数组复制不完整或引用复制错误

你可能没正确完成tempPay的值复制:

  • 错误示例1(引用复制):int[] tempPay = empPay; 这种写法会让tempPay和empPay指向同一个数组,排序empPay后tempPay也会被修改,后续查找索引时逻辑完全混乱,甚至因遍历逻辑错误触发越界。
  • 错误示例2(长度不足):复制时循环次数写错,比如for(int i=0; i < empPay.length-1; i++),导致tempPay少复制最后一个元素。后续查找该元素时,遍历到tempPay的边界外(比如tempPay长度为4,却访问索引4),直接抛出异常。

3. 索引查找的循环边界错误

如果是手动遍历tempPay找匹配元素,循环条件写错会直接越界:
错误示例:

int findIndex(int target, int[] arr) {
    for(int i=0; i <= arr.length; i++){ // 这里用了<=,i会等于数组长度
        if(arr[i] == target){
            return i;
        }
    }
    return -1;
}

数组的有效索引范围是0到arr.length-1,当i=arr.length时,arr[i]就会触发IndexOutOfBoundException。示例中用的是i < arr.length,所以不会出现这个问题。

4. 数组长度不一致

如果tempPay的初始化长度和empPay不匹配,比如int[] tempPay = new int[empPay.length - 1];,后续访问索引等于原empPay长度-1的元素时,tempPay没有这个索引,直接越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:50:26