在Java循环中捕获异常并让流程继续执行的关键是将try-catch置于循环体内而非包裹整个循环,确保单次迭代异常不影响后续执行;需记录日志、设默认值或跳过当前项,避免throw新异常,优先使用try-with-resources管理资源,并杜绝空catch块。

在 Java 循环中捕获异常并让流程继续执行,关键是在循环体内用 try-catch 包住可能出错的代码,而不是把整个循环包进去。这样单次迭代出错不会中断后续迭代。
把 try-catch 放在循环体内部
错误做法是把 for 或 while 整个包进 try 块——一旦异常抛出,循环就退出。正确方式是让每次迭代独立处理异常:
- 对每条数据、每次调用或每个操作单独加 try-catch
- catch 后可记录日志、设默认值、跳过当前项,然后 continue(显式或隐式)
- 避免在 catch 中 throw 新异常(除非有意终止)
常见场景与写法示例
比如遍历列表解析 JSON 字符串:
for (String json : jsonList) {
try {
User user = objectMapper.readValue(json, User.class);
users.add(user);
} catch (JsonProcessingException e) {
System.err.println("解析失败: " + json + ", 原因: " + e.getMessage());
// 忽略该条,继续下一次
}
}
再比如调用外部 HTTP 接口:
立即学习“Java免费学习笔记(深入)”;
for (String url : urls) {
try {
String response = httpClient.get(url);
process(response);
} catch (IOException | InterruptedException e) {
logger.warn("请求 {} 失败,跳过", url, e);
// 不 throw,不 return,循环自动进入下一轮
}
}
注意资源清理和状态一致性
如果循环中涉及资源(如文件、连接),需确保即使出异常也不泄漏:
- 优先使用 try-with-resources(适用于 AutoCloseable 资源)
- 若必须手动 close,把 close() 放在 finally 块里,或用 try-catch 包住 close 操作
- 避免在 catch 中修改共享状态(如全局计数器)却不加同步,引发并发问题
慎用“吞掉”异常
空 catch 块(catch (Exception e) {})虽能保持运行,但极难排查问题:
- 至少记录异常(log.error 或 log.warn)
- 考虑区分异常类型:业务异常可忽略,系统异常(如 OutOfMemoryError)通常不应静默处理
- 必要时用 counter 或集合收集失败项,便于事后分析
不复杂但容易忽略——只要异常不出 try 块,循环就不会断。核心是粒度够细、处理有依据、日志留痕迹。


















