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

迭代列表删除元素并插入队列时触发java.util.NoSuchElementException求助

问题分析与解决

错误原因

你的代码逻辑存在明显问题:外层while(listCorreos.hasNext())仅在进入循环时检查一次迭代器是否还有元素,但内层for (Cola cola : colas)会多次调用listCorreos.next()和listCorreos.remove()。当colas的数量大于当前剩余的邮件数量时,迭代器已经没有元素了,内层循环仍会执行next()方法,直接触发NoSuchElementException。

举个例子:如果request.getCorreos()只有2个邮件,而colas有3个队列,第一次进入while循环后,内层for循环前两次会分别取走两个邮件并删除,第三次循环时,迭代器已经没有元素,调用next()就会报错。

解决方案

根据你的业务需求,分两种情况处理:

情况1:每个邮件需要插入到所有队列中

如果是要把每一封邮件都添加到所有队列,不需要在迭代时删除元素,直接遍历所有邮件,再逐个插入队列即可:

// 遍历所有邮件
for (String correo : request.getCorreos()) {
    // 将当前邮件插入到每个队列
    for (Cola cola : colas) {
        cola.insertar(correo);
        System.err.println("Se agrego " + correo + " a la cola: " + cola.obtenerNombre());
    }
}
// 如果需要清空原邮件列表,直接调用clear()
request.getCorreos().clear();

情况2:邮件依次分配到不同队列(循环分配)

如果是要把邮件逐个分配给队列(比如第一封给第一个队列,第二封给第二个,循环往复),需要同时控制队列和邮件的迭代:

Iterator<String> correoIterator = request.getCorreos().iterator();
Iterator<Cola> colaIterator = colas.iterator();

while (correoIterator.hasNext()) {
    // 如果队列迭代器遍历完了,重置从头开始
    if (!colaIterator.hasNext()) {
        colaIterator = colas.iterator();
    }
    Cola currentCola = colaIterator.next();
    String correo = correoIterator.next();
    
    currentCola.insertar(correo);
    System.err.println("Se agrego " + correo + " a la cola: " + currentCola.obtenerNombre());
    
    correoIterator.remove();
}

内容的提问来源于stack exchange,提问作者MariaRambo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:20:22