空 catch 块会掩盖异常、破坏调用链、缺失日志、违反防御性编程原则;正确做法是捕获具体异常、记录日志、必要时重抛或使用 try-with-resources。

捕获异常却不处理(即空的 catch 块),是 Java 中典型的“异常吞噬”行为,会掩盖真实问题,导致程序行为不可预测、调试困难、故障难以定位。
掩盖错误根源,让 bug 隐蔽潜伏
异常是 JVM 发出的问题信号,比如空指针、数组越界、IO 失败、数据库连接中断等。一旦用 catch (Exception e) { } 吞掉,程序看似“继续运行”,但实际状态可能已损坏——对象未初始化、数据未保存、资源未释放、业务逻辑跳过关键步骤。后续操作可能基于错误前提执行,引发更隐蔽的连锁错误。
破坏调用链,阻断上层错误感知
Java 异常机制依赖“抛出–传播–捕获–处理”链条。空 catch 相当于在中途强行截断:下层方法抛出异常本意是通知上层“这里出事了,请决策”,而空捕获让上层完全收不到信号,无法做重试、回滚、降级或告警。尤其在服务间调用或事务场景中,这极易造成数据不一致或状态丢失。
日志缺失,排查成本陡增
没有记录异常堆栈,等于抹掉了唯一的诊断线索。生产环境出问题时,运维和开发看不到错误时间、类名、行号、异常类型和上下文变量值。常见表现是“功能突然失效但无报错日志”,只能靠反复加日志、重启复现、猜测路径,极大拖慢故障响应速度。
立即学习“Java免费学习笔记(深入)”;
违反防御性编程原则,降低代码可信度
空 catch 传递出一种“我不管它会不会出错”的消极信号。其他开发者看到这类代码,会质疑其健壮性;静态检查工具(如 SonarQube、Checkstyle)通常会直接标记为严重缺陷;在金融、电信等高可靠性系统中,这种写法往往通不过代码评审或安全审计。
正确做法包括:
- 明确知道该异常可安全忽略?——仍需添加注释说明原因,并记录日志(至少
logger.debug("expected timeout, ignored", e)) - 需要静默处理?——优先捕获具体异常类型(如
catch (FileNotFoundException e)),而非笼统的Exception - 暂时没想好怎么处理?——至少保留
throw new RuntimeException(e)或重新抛出原始异常,避免丢失堆栈 - 涉及资源操作?——使用 try-with-resources 替代手动 close,避免因异常导致资源泄漏
不复杂但容易忽略。一次空 catch,可能埋下线上事故的种子。










