Java中Iterator遍历时异常默认中断遍历,需主动捕获并决定是否继续:容错场景用try-catch包裹next()操作;强一致性场景应提前终止并清理资源;ConcurrentModificationException重在预防;Stream可更优雅实现异常容忍。

Java 中 Iterator 遍历时若发生异常(如 NullPointerException、ConcurrentModificationException 或业务校验失败),默认会中断遍历并抛出异常,后续元素不再访问。要“处理”这种中断,核心不是阻止异常发生,而是**主动捕获、合理响应,并决定是否继续迭代**。
捕获异常后继续遍历(推荐用于容错场景)
在 while(iterator.hasNext()) 循环内用 try-catch 包裹 iterator.next() 和后续操作,使单个元素的异常不影响整体流程:
- 适用于日志采集、批量数据清洗、非关键字段解析等允许部分失败的场景
- 注意:仅捕获具体异常类型(如
NumberFormatException),避免吞掉RuntimeException导致问题被掩盖 - 建议记录异常上下文(如当前元素、索引或 ID),便于事后排查
示例:
Iterator<String> it = list.iterator();while (it.hasNext()) {
try {
String s = it.next();
int num = Integer.parseInt(s); // 可能抛 NumberFormatException
System.out.println("Parsed: " + num);
} catch (NumberFormatException e) {
System.err.println("Skip invalid number: " + e.getMessage());
}
}
提前终止并清理(适用于强一致性要求)
当某个异常表明整体状态已不可靠(如数据库连接中断、权限校验失败、资源不可用),应主动跳出循环,并执行必要回滚或释放操作:
立即学习“Java免费学习笔记(深入)”;
- 使用
break或带标签的break退出迭代 - 确保在
finally块或try-with-resources中释放资源(如关闭流、归还连接) - 可封装为方法,返回处理结果统计(成功数/失败数/异常类型)
避免 ConcurrentModificationException 的根本方式
该异常不是“遍历中抛出的业务异常”,而是因**迭代器检测到集合被外部线程或同一线程其他代码修改**所致。处理重点是预防而非捕获:
- 单线程下:遍历时不要调用
list.remove()、list.add()等结构性修改方法;需删除时用iterator.remove() - 多线程下:使用线程安全集合(如
CopyOnWriteArrayList、ConcurrentHashMap的 keySet/entrySet 迭代器),或加锁同步访问 - 不依赖迭代器快照语义时,可改用增强 for 循环(底层仍用 Iterator,但写法更简洁)
用 Stream 替代手动迭代(现代 Java 推荐)
JDK 8+ 中,用 Stream 可更清晰地表达“异常容忍”逻辑:
-
stream.map(...).filter(Objects::nonNull).forEach(...)天然跳过 null 或中间结果 - 对可能异常的操作,封装为返回
Optional的函数(如s -> parseSafe(s)),再用flatMap(Optional::stream)过滤失败项 - 需精确控制中断点时,仍可结合
try-catch在 lambda 内处理


















