迭代列表删除元素并插入队列时触发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
相关产品推荐
相关产品推荐

