Java作业问题:按阈值移除数组中Home对象的方法异常排查
解决Java数组移除Home对象的异常问题
嘿,我看你这个问题挺典型的——数组移除元素时很容易踩的坑!先帮你拆解下问题根源,再给你靠谱的修复方案。
问题根源分析
从你给出的代码片段来看,最可能导致“有时移除、有时未移除”的原因有两个:
- 数组越界异常:你的while循环条件顺序搞反了!你写的是
(this.homeList[index].costPerMonth() < cost) && (index < this.numHomes),Java的逻辑与是短路判断,但这里是先访问数组元素,再判断index是否在合法范围内。当index等于numHomes时,直接访问homeList[index]会抛出ArrayIndexOutOfBoundsException,如果没有捕获这个异常,方法会直接终止,后面的元素根本没机会处理;如果有捕获,后续循环也会中断,导致部分元素没被移除。 - 逻辑判断模糊:你要移除的是每月成本高于阈值的对象,但代码里判断的是
costPerMonth() < cost,等于阈值的对象会被保留,这本身没问题,但表述不够清晰,容易混淆逻辑。
修复方案
方案1:修复原有的do-while逻辑
调整条件顺序,避免越界,同时明确判断逻辑:
public int remove(double cost) { int count = 0; int index; do { index = 0; // 先判断index是否在合法范围内,再访问数组元素,彻底避免越界 while (index < this.numHomes && this.homeList[index].costPerMonth() <= cost) { // 保留<=阈值的元素,找到第一个需要移除的元素(>阈值) index++; } if (index < this.numHomes) { // 移除index位置的元素:将后续元素前移一位 for (int i = index; i < this.numHomes - 1; i++) { this.homeList[i] = this.homeList[i + 1]; } this.numHomes--; count++; } } while (index < this.numHomes); return count; }
方案2:更高效的单遍历实现(推荐)
这种方式只需要遍历一次数组,把需要保留的元素移到数组前端,效率更高,也不会有越界或跳过元素的问题:
public int remove(double cost) { int keepIndex = 0; // 遍历所有现有Home对象 for (int i = 0; i < this.numHomes; i++) { if (this.homeList[i].costPerMonth() <= cost) { // 保留符合条件的对象,放到keepIndex位置 this.homeList[keepIndex] = this.homeList[i]; keepIndex++; } // 不符合条件的直接跳过,不保留 } // 计算移除的数量,更新有效元素个数 int removedCount = this.numHomes - keepIndex; this.numHomes = keepIndex; return removedCount; }
验证建议
你可以测试这两种方案:
- 测试包含连续多个需要移除的Home对象的场景
- 测试阈值等于某个Home的每月成本的场景
- 测试所有对象都需要移除/都不需要移除的边界场景
这样就能确保所有符合条件的对象都被正确移除啦!
内容的提问来源于stack exchange,提问作者C. Liff
相关产品推荐
相关产品推荐

