使用Iterator时出现无限循环,新手求助技术排查
嘿,作为Iterator新手遇到这种问题太正常啦!我来帮你拆解一下核心痛点,再给你针对性的解决方案~
首先,从你的描述和代码片段来看,你要实现的是把未到达目标站的Car从当前Station移到下一个Station,这里最容易踩的坑就是「遍历集合时修改集合导致的并发修改异常」,还有「如何安全获取下一个Station」的问题,我给你一步步理清楚:
核心问题分析
你现在用了Iterator<Station>来遍历所有Station,但如果直接在遍历过程中操作Station里的Car列表(比如移除元素),或者处理下一个Station时逻辑没理顺,很容易抛出ConcurrentModificationException——这是因为Java的集合迭代器是「快速失败」的,一旦检测到遍历过程中集合被修改(除了迭代器自己的remove()方法),就会直接报错。
解决方案一:用索引遍历Station(更直观)
如果你的allStations是有序集合(比如ArrayList<Station>,毕竟线路的Station肯定是有顺序的),用索引遍历会更方便,能直接拿到下一个Station,代码示例如下:
// 用索引遍历所有Station,方便获取下一个站 for (int i = 0; i < allStations.size(); i++) { Station currentStation = allStations.get(i); // 用Iterator遍历当前站的Car列表,安全移除元素 Iterator<Car> carIterator = currentStation.getCars().iterator(); while (carIterator.hasNext()) { Car car = carIterator.next(); // 检查Car是否到达目标站 if (!car.getTargetStation().equals(currentStation)) { // 用Iterator的remove()方法移除,避免并发异常 carIterator.remove(); // 把Car加到下一个站(要判断是不是最后一个站) if (i + 1 < allStations.size()) { Station nextStation = allStations.get(i + 1); nextStation.getCars().add(car); } else { // 处理最后一个站的情况:没有下一站了,做收尾(比如标记Car到达终点) System.out.println("Car已到达线路终点,完成运输"); } } } }
解决方案二:用Station Iterator处理(坚持用迭代器的话)
如果一定要用Iterator<Station>,可以提前缓存下一个Station,避免遍历逻辑混乱,代码示例:
Iterator<Station> stationIterator = allStations.iterator(); Station currentStation = null; while (stationIterator.hasNext()) { Station nextStation = stationIterator.next(); // 第一次循环时currentStation为null,跳过处理 if (currentStation != null) { Iterator<Car> carIterator = currentStation.getCars().iterator(); while (carIterator.hasNext()) { Car car = carIterator.next(); if (!car.getTargetStation().equals(currentStation)) { carIterator.remove(); nextStation.getCars().add(car); } } } // 更新currentStation为当前遍历到的站,供下一次循环处理 currentStation = nextStation; } // 单独处理最后一个站的Car(没有下一站的情况) if (currentStation != null) { Iterator<Car> carIterator = currentStation.getCars().iterator(); while (carIterator.hasNext()) { Car car = carIterator.next(); if (!car.getTargetStation().equals(currentStation)) { carIterator.remove(); System.out.println("Car已到达线路终点,结束运输"); } } }
几个关键注意点
- 永远不要在foreach增强循环中直接移除/添加集合元素,一定要用
Iterator的remove()方法,或者用索引遍历有序集合。 - 确保
allStations是有序集合(比如ArrayList),不然「下一个Station」的逻辑就不成立了——总不能让Car随便跳站吧😉。 - 一定要处理边界情况:最后一个Station的Car如果还没到目标,这时候没有下一站,得单独做收尾处理,比如移除Car或者标记完成。
内容的提问来源于stack exchange,提问作者Mauve
相关产品推荐
相关产品推荐

