Java中try-catch捕获运行期异常的核心是将可能出错的代码放入try块,用指定类型catch块处理,多catch须子类在前、父类在后;避免空catch,应记录日志或恢复逻辑;资源释放优先用try-with-resources而非finally。

Java 中用 try-catch 捕获运行期异常,核心是把可能出错的代码放进 try 块,把应对措施写在 catch 块里,再根据需要决定是否继续执行或主动终止。
try-catch 的基本结构要写对
try 后面必须紧跟一个或多个 catch,或者加一个 finally;catch 必须指定具体的异常类型(不能只写 Exception 除非真有必要);多个 catch 要按“子类在前、父类在后”的顺序排列,否则编译不通过。
- 正确写法示例:
- try { int result = 10 / 0; } catch (ArithmeticException e) { System.out.println("除零错误:" + e.getMessage()); }
- 错误写法:把 Exception 写在 ArithmeticException 前面,会导致子类异常永远捕获不到
捕获异常后别只打印堆栈就完事
单纯调用 e.printStackTrace() 只适合调试,上线环境应记录日志、给出用户友好的提示,或尝试恢复逻辑。比如读文件失败,可以提示“配置文件缺失,请检查路径”,而不是直接抛出 FileNotFoundException 的原始信息。
- 推荐做法:用日志框架(如 SLF4J)记录异常详情,同时返回明确的业务错误码或提示
- 避免空 catch:不要写 catch (Exception e) {},这会让问题静默消失,极难排查
- 必要时重新抛出:处理完部分逻辑后,可封装成自定义异常再 throw,便于上层统一处理
finally 或 try-with-resources 用来保资源释放
数据库连接、文件流、网络套接字这些资源,即使发生异常也必须关闭,否则容易内存泄漏或文件句柄耗尽。finally 块总会执行,但更推荐用 try-with-resources(JDK 7+),它能自动关闭实现了 AutoCloseable 的资源。
立即学习“Java免费学习笔记(深入)”;
- 传统方式:finally { if (file != null) file.close(); }
- 推荐方式:try (FileInputStream fis = new FileInputStream("a.txt")) { ... },括号里的资源会自动 close
- 注意:try-with-resources 中如果 try 块和 close() 都抛异常,后者会被抑制,可通过 e.getSuppressed() 查看
哪些异常该捕获,哪些该声明抛出
RuntimeException 及其子类(如 NullPointerException、ArrayIndexOutOfBoundsException)属于运行时异常,编译器不强制要求处理;而 IOException、SQLException 这类检查型异常(checked exception),要么 catch,要么在方法签名加 throws 声明。
- 业务逻辑中遇到空指针,通常说明代码有缺陷,应提前判空,而不是靠 catch 处理
- 调用外部 API 或读写文件时,IO 异常无法完全避免,适合用 try-catch 做容错
- 若当前方法不适合处理异常(比如 DAO 层不该决定怎么提示用户),就用 throws 交给上层服务或控制器统一响应


















