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

插入排序数组时触发ArrayIndexOutOfBoundsException(-1)求助

问题分析与修复方案

这个ArrayIndexOutOfBoundsException: -1的核心原因很明确:你在第62行使用的location变量值变成了-1,而数组下标是从0开始的,自然会触发越界错误。结合你说的“单独按城镇排序正常,加租金校验就出错”的情况,大概率是插入位置计算逻辑在处理同城镇租金比较时,没控制好循环边界,导致location被减到了-1。

为什么会出现这种情况?

举个典型的错误场景:
假设你是从数组已有元素的末尾往前遍历找插入位置,逻辑大概是:

  1. 先比较城镇字母序,如果当前元素的城镇比新元素大,就把location减1继续找;
  2. 如果城镇相同,再比较租金,如果当前元素租金比新元素高,也把location减1;
  3. 但你没在循环条件里先判断location >= 0,导致当所有元素的城镇都比新元素大,或者同城镇的所有元素租金都比新元素高时,location会一直减到-1,这时候还去访问propertyList[location]就直接报错了。

比如你可能写了类似这样的错误循环:

// 错误示例:循环条件没先判断location >=0
while (propertyList[location].getTown().compareToIgnoreCase(town) > 0 
       || (propertyList[location].getTown().compareToIgnoreCase(town) == 0 
           && propertyList[location].getRent() > newRent)) {
    location--;
}

修复步骤

  1. 给循环加上边界判断:把location >= 0作为循环的第一个条件,利用Java的短路求值特性,避免越界访问:

    int location = currentSize - 1; // currentSize是当前数组中已有元素的数量
    String newTown = ...; // 新房产的城镇名称
    double newRent = ...; // 新房产的租金
    
    while (location >= 0) {
        String currentTown = propertyList[location].getTown();
        int townCompareResult = currentTown.compareToIgnoreCase(newTown);
        
        if (townCompareResult > 0) {
            // 当前元素城镇字母序更大,继续往前找插入位置
            location--;
        } else if (townCompareResult == 0) {
            // 城镇相同,比较租金
            double currentRent = propertyList[location].getRent();
            if (currentRent > newRent) {
                // 当前元素租金更高,继续往前找
                location--;
            } else {
                // 找到合适位置,停止循环
                break;
            }
        } else {
            // 当前元素城镇字母序更小,停止循环
            break;
        }
    }
    
  2. 确定正确的插入位置:循环结束后,location可能是-1(说明要插在数组最前面),或者是某个合法下标,此时正确的插入位置是location + 1:

    int insertPosition = location + 1;
    // 接下来执行数组元素后移、插入新元素的逻辑
    // 比如:System.arraycopy(propertyList, insertPosition, propertyList, insertPosition + 1, currentSize - insertPosition);
    // propertyList[insertPosition] = new Property(reference, ...);
    // currentSize++;
    
  3. 调试验证:在第62行之前加个调试输出(比如System.out.println("location值:" + location);),就能直观看到location什么时候变成了-1,也能验证修复后的逻辑是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:52:08