实现vehicles ArrayList全量入库至空的代码异常问题排查
问题分析与修复代码
你的代码目标是将vehicles列表中的所有车辆停入匹配的车库,直到列表为空,但后续循环无法继续完成停车操作,核心问题出在循环逻辑和车库更新逻辑上:
1. 车辆与车库匹配的循环逻辑漏洞
原嵌套循环中i和j的自增/自减逻辑存在错误:
- 当车库空间与车辆空间不匹配时,直接执行
i--,跳过了当前车辆匹配其他车库的可能,导致部分符合条件的车辆被遗漏 j的自增仅在条件不满足时触发,一旦进入特定分支会导致j停滞,无法遍历全部车库
2. 车库空间更新与车辆移除的逻辑错误
在更新车库位置和移除已停放车辆的代码块中:
- 遍历
garage.get(i).getCarry()时同步执行removeVehicles,会导致列表结构变化,后续get(j)会获取错误元素(索引错位) - 多次执行
setCurrentSpace会将车库最终空间覆盖为最后一辆车的目的地,不符合逐个处理的预期
修复后的代码
while (!vehicles.isEmpty()) { // 倒序遍历vehicles,避免移除元素时索引混乱 for (int i = vehicles.size() - 1; i >= 0; i--) { Vehicle currentVehicle = vehicles.get(i); boolean parked = false; // 遍历所有车库,尝试匹配当前车辆 for (GarageSpace garageSpace : garage) { // 检查空间匹配、类型兼容、剩余容量 if (garageSpace.getSpace() == currentVehicle.getSpace() && garageSpace.garageRequest(currentVehicle.getvehiclesType()) && garageSpace.getLimit() > 0) { garageSpace.addvehicles(currentVehicle); vehicles.remove(i); parked = true; break; } } // 未找到车位的车辆留到下一轮循环处理 if (!parked) { continue; } } // 更新车库位置并移除已停放车辆(避免遍历原列表时修改结构) for (GarageSpace garageSpace : garage) { List<Vehicle> parkedVehicles = new ArrayList<>(garageSpace.getCarry()); for (Vehicle parkedCar : parkedVehicles) { garageSpace.setCurrentSpace(parkedCar.getDestinationSpace()); garageSpace.removeVehicles(parkedCar); } } }
关键修复说明
- 匹配逻辑优化:先取出当前车辆,再遍历所有车库尝试匹配,确保每个车辆都能检查所有符合条件的车库,避免原代码的遗漏问题
- 遍历安全处理:更新车库时先复制已停放车辆的列表,再遍历副本执行移除操作,避免原列表结构变化导致的索引错误
- 可读性提升:使用增强for循环替代下标循环,减少索引操作带来的错误,逻辑更清晰
- 规范判断:用
!vehicles.isEmpty()替代vehicles.size() != 0,符合Java代码规范
内容的提问来源于stack exchange,提问作者Joseph Martíñez
相关产品推荐
相关产品推荐

