try-with-resources 能自动关闭实现 autocloseable 接口的资源,无需 finally 和判空,按声明逆序关闭,异常时仍执行关闭且不覆盖主异常,支持 suppressed exception。

try-with-resources 能自动关闭资源,避免手动调用 close() 的繁琐和遗漏,让 IO 代码更简洁、健壮。
自动管理资源生命周期
只要实现 AutoCloseable 接口(如 FileInputStream、BufferedReader、Connection 等),就能在 try 括号中声明,JVM 会在 try 块结束时(无论是否异常)自动调用 close()。
- 不用写
finally块,也不用判空再关流 - 多个资源用分号隔开,按声明逆序关闭(后声明的先关闭),符合依赖关系逻辑
- 即使发生异常,关闭动作仍会执行,且原始异常不会被覆盖(Java 7+ 支持 suppressed exception 机制)
替代传统 try-catch-finally 冗余写法
以前常这样写,容易漏关、重复关或忽略关闭异常:
❌ 易出错写法InputStream is = null;
try {
is = new FileInputStream("data.txt");
// ...读取操作
} catch (IOException e) {
// 处理异常
} finally {
if (is != null) {
try { is.close(); } catch (IOException ignored) {}
}
}
用 try-with-resources 后,等价但干净得多:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
try (FileInputStream is = new FileInputStream("data.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
String line = reader.readLine();
// ...处理逻辑
} catch (IOException e) {
// 异常统一处理
}
配合新 API 提升可读性与性能
结合 Files.newBufferedReader()、Files.newOutputStream() 等 NIO.2 工具方法,能进一步减少样板代码,并利用底层优化:
- 直接传入
Path,无需手动构造FileInputStream/FileOutputStream - 支持指定字符集(如
StandardCharsets.UTF_8),避免平台默认编码陷阱 - 内部已做缓冲和资源封装,比裸流更安全高效
示例:
try (BufferedReader reader = Files.newBufferedReader(Paths.get("input.txt"), StandardCharsets.UTF_8);
BufferedWriter writer = Files.newBufferedWriter(Paths.get("output.txt"), StandardCharsets.UTF_8)) {
reader.lines().map(String::toUpperCase).forEachOrdered(line -> {
try { writer.write(line); writer.newLine(); } catch (IOException ignored) {}
});
}
注意异常叠加与资源初始化顺序
如果多个资源初始化过程中某个抛出异常,前面已成功创建的资源仍会被正常关闭;而 try 块内抛异常时,所有已成功初始化的资源都会依次关闭,关闭异常会以 suppressed 方式附加到主异常上。
- 可通过
exception.getSuppressed()查看关闭阶段的异常 - 若需区分“业务异常”和“关闭失败”,建议在日志中显式记录 suppressed 异常
- 避免在资源声明行做复杂逻辑(如条件判断、方法链调用),以防初始化失败时难以定位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










