插入排序数组时触发ArrayIndexOutOfBoundsException(-1)求助
问题分析与修复方案
这个ArrayIndexOutOfBoundsException: -1的核心原因很明确:你在第62行使用的location变量值变成了-1,而数组下标是从0开始的,自然会触发越界错误。结合你说的“单独按城镇排序正常,加租金校验就出错”的情况,大概率是插入位置计算逻辑在处理同城镇租金比较时,没控制好循环边界,导致location被减到了-1。
为什么会出现这种情况?
举个典型的错误场景:
假设你是从数组已有元素的末尾往前遍历找插入位置,逻辑大概是:
- 先比较城镇字母序,如果当前元素的城镇比新元素大,就把
location减1继续找; - 如果城镇相同,再比较租金,如果当前元素租金比新元素高,也把
location减1; - 但你没在循环条件里先判断
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--; }
修复步骤
给循环加上边界判断:把
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; } }确定正确的插入位置:循环结束后,
location可能是-1(说明要插在数组最前面),或者是某个合法下标,此时正确的插入位置是location + 1:int insertPosition = location + 1; // 接下来执行数组元素后移、插入新元素的逻辑 // 比如:System.arraycopy(propertyList, insertPosition, propertyList, insertPosition + 1, currentSize - insertPosition); // propertyList[insertPosition] = new Property(reference, ...); // currentSize++;调试验证:在第62行之前加个调试输出(比如
System.out.println("location值:" + location);),就能直观看到location什么时候变成了-1,也能验证修复后的逻辑是否正常。
内容的提问来源于stack exchange,提问作者user9240778
相关产品推荐
相关产品推荐

