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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:45