924 字
5 分钟
Java 异常与资源管理:检查型异常、finally 与自动关闭

异常处理的目标是让错误被正确传播或恢复,并保证资源得到释放。面试先答分类,再说明处理边界,不需要背完整异常继承树。

Throwable、Error、Exception#

Throwable 是可抛出对象的基础类型。下面主要分为 Error 和 Exception。

分类例子基础理解
ErrorOutOfMemoryError、StackOverflowError通常表示 JVM 或运行环境的严重问题,普通业务通常不尝试捕获后继续运行
检查型异常IOException、SQLException编译器要求捕获或通过 throws 声明
非检查型异常NullPointerException、IllegalArgumentExceptionRuntimeException 及其子类,不强制声明或捕获

“检查型”说的是编译器是否检查处理义务,异常实际仍发生在运行时。不能把所有 Exception 都叫检查型异常,RuntimeException 属于 Exception,但不是检查型异常。

throw 与 throws#

throw 在方法内部抛出一个异常对象;throws 在方法签名上声明可能抛出的异常类型,将处理责任交给调用方。

static void validateAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("age must be non-negative");
}
}

多个 catch 应先写具体子类,再写范围更广的父类,否则子类分支可能无法到达。

finally 一定执行吗?#

正常离开 try/catch 时,finally 通常执行,包括 try 中发生异常或 return。进程被强制终止、执行 System.exit、运行环境崩溃等情况下,不能保证执行;try 一直没有退出时,也不会进入 finally。

不要在 finally 中 return 或抛出新的无关异常。 它可能覆盖原返回值或原异常,隐藏真正的问题。

如果 try 里准备返回对象引用,finally 又修改了该对象,调用方能看到修改后的状态;不能简单理解为“return 后任何改变都无效”。

try-with-resources 有什么用?#

实现 AutoCloseable 的资源可以交给 try-with-resources 自动关闭,常用于输入输出流、数据库连接等。

try (InputStream input = Files.newInputStream(path)) {
byte[] bytes = input.readAllBytes();
// 这里处理内容;大文件不应一次性全部读入内存
}

资源在退出代码块时自动关闭,多个资源按声明的逆序关闭。如果业务操作和 close 都抛异常,业务异常通常作为主异常,关闭异常保存在 suppressed exceptions 中,便于追踪。

GC 回收 Java 对象内存,不等于及时归还文件句柄、连接等外部资源。把连接变量设为 null 不能代替 close;连接池中的 close 通常表示归还连接到池中。

业务中怎样处理异常?#

可以恢复就恢复,例如处理明确可重试的暂时故障;无法恢复则向上抛,由统一异常处理层转换为合适响应。包装异常时保留 cause,例如 new IllegalStateException("load failed", e)。

不要捕获异常后什么都不做,也不要在每一层重复记录同一个异常。错误日志应保留异常堆栈和必要业务上下文,但响应中不直接暴露数据库和内部调用细节。

面试回答模板#

Java 异常体系基于 Throwable,Error 通常对应严重运行问题,Exception 包括检查型和非检查型异常。检查型异常必须捕获或声明,RuntimeException 不强制处理。throw 负责实际抛出,throws 声明可能抛出的类型。finally 用于清理,但不能保证在进程终止等情况下执行,资源关闭优先使用 try-with-resources。

自测#

  1. RuntimeException 是检查型异常吗?不是。
  2. GC 能替代关闭数据库连接吗?不能,必须显式归还或关闭。
  3. finally 中 return 有什么风险?覆盖 try/catch 的返回结果,甚至吞掉异常。
Java 异常与资源管理:检查型异常、finally 与自动关闭
https://blog.xqcherry.top/posts/interview/java/java-exceptions-and-resources/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0