Java循环中捕获异常的关键在于精准分层处理:可恢复异常重试、数据错误跳过、系统异常应抛出;避免宽泛捕获或外层包裹,防止资源泄漏、死循环和掩盖问题。

在 Java 循环中捕获异常,关键不是“能不能 catch”,而是“在哪 catch、怎么处理、会不会破坏循环逻辑”。常见错误是把 try-catch 套在整个循环外面,或在循环体内盲目 catch 所有异常,结果导致程序卡死、跳过关键步骤,甚至掩盖真实问题。
别把 try-catch 套在 while 外面当“保险柜”
比如这样写:
while (hasNext()) {
try {
processNext();
} catch (Exception e) {
// 空处理 or 仅打印日志
}
}
表面看能“兜住”异常,但问题很多:
立即学习“Java免费学习笔记(深入)”;
- 如果 processNext() 抛出的是资源泄漏类异常(如未关闭的流),catch 后不清理,下次迭代可能失败
- 若异常源于数据非法(如空指针、格式错误),不跳过当前项就继续下一轮,容易重复报错甚至死循环
- 用 Exception 捕获太宽泛,会吞掉本该中断流程的严重异常(如 OutOfMemoryError)
按场景分层处理:跳过、重试、中断
循环中遇到异常,要先判断它属于哪一类:
- 可恢复的临时性异常(如网络超时、数据库连接抖动)→ 可加简单重试(最多 2–3 次),用计数器控制,避免无限等待
- 数据本身有问题(如 JSON 解析失败、数字格式错误)→ 记录日志 + 跳过当前项(continue),保证后续合法数据继续处理
- 系统级不可恢复异常(如文件系统只读、配置缺失、SecurityException)→ 不建议在循环内捕获,应提前校验或让异常向上抛出,由外层统一决策是否终止整个流程
输入验证类循环:必须清缓冲区
用 Scanner 读控制台整数时,很多人写:
while (!valid) {
try {
num = scanner.nextInt(); // ❌ 错误起点
valid = true;
} catch (InputMismatchException e) {
System.out.println("请输入整数");
}
}
这会导致输入字母后无限打印提示——因为 nextInt() 失败不消耗输入,下一次还读到同一个非法 token。
✅ 正确做法是:
- 一律用 scanner.nextLine() 读整行字符串
- trim() 去空格,判空后再尝试 Integer.parseInt()
- 只捕获 NumberFormatException,其他异常不拦截
数组遍历越界:优先用 for-each 或边界检查
手动用 while(i
- 用 for-each 替代下标访问(无索引风险)
- 必须用下标时,在访问前加 if (i >= 0 && i
- 真要 catch,也只捕获 ArrayIndexOutOfBoundsException,并立即 break 或 log 后跳过,不要继续递增 i


















