Iterator操作可能抛出NoSuchElementException、ConcurrentModificationException和IllegalStateException;需在调用next()、remove()等方法时用try-catch捕获,而非捕获Iterator本身。

Java 中 Iterator 本身不会主动“抛出异常”,但你在使用它的过程中(比如调用 next()、remove())可能触发 运行时异常,最常见的是 ConcurrentModificationException 和 NoSuchElementException。这些异常不能靠“捕获 Iterator 本身”来处理,而是要在调用其方法的代码中显式 try-catch。
哪些 Iterator 操作会抛异常?
标准 JDK 的 Iterator(如 ArrayList.iterator()、HashMap.keySet().iterator())在以下情况会抛异常:
-
NoSuchElementException:调用next()但已无元素可取(即hasNext()返回false后还调用next()) -
ConcurrentModificationException:迭代过程中,集合被非 Iterator 自身方式修改(如直接调用list.add()、map.put()),且该集合是 fail-fast 的(绝大多数 JDK 集合都是) -
IllegalStateException:调用remove()前未成功调用过next(),或已调用过一次remove()后重复调用
如何安全捕获这些异常?
在循环中手动调用 next() 和 remove() 时,把操作包裹在 try-catch 块里即可。注意:增强 for 循环(for (T t : list))底层也用 Iterator,但它不暴露异常,一旦出错会直接中断并抛出,无法在语法层面捕获——所以需改用显式 Iterator。
示例:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
try {
String s = it.next(); // 可能抛 NoSuchElementException 或 ConcurrentModificationException
if ("error".equals(s)) {
it.remove(); // 可能抛 IllegalStateException 或 ConcurrentModificationException
}
} catch (NoSuchElementException e) {
System.err.println("迭代器已到末尾");
} catch (ConcurrentModificationException e) {
System.err.println("集合被并发修改,建议加锁或改用 CopyOnWriteArrayList");
} catch (IllegalStateException e) {
System.err.println("remove 调用不合法:" + e.getMessage());
}
}
避免异常比捕获更关键
多数情况下,异常反映的是逻辑问题,而非正常流程分支。推荐优先通过规范写法规避:
- 始终先调用
hasNext()再调用next() - 删除元素时只在刚调用完
next()后调用一次remove() - 多线程环境下,用线程安全集合(如
CopyOnWriteArrayList、ConcurrentHashMap)或手动同步 - 若需边遍历边修改结构(如过滤),考虑收集待删元素再批量删除,或使用
removeIf()(JDK 8+)
特殊场景:自定义 Iterator
如果你实现自己的 Iterator,可在 next() 或 remove() 方法中主动 throw 异常(如校验参数、资源状态等)。这时捕获方式相同——在调用处 try-catch 对应的异常类型即可。

















