try-with-resources 要求资源实现 AutoCloseable 接口,如 FileInputStream、BufferedReader、JDBC 资源等;资源在 try 括号中声明并按逆序自动关闭;支持抑制异常处理,比传统 try-catch-finally 更安全简洁。

Java 的 try-with-resources 是一种自动管理资源的语法,能确保在 try 块结束时(无论是否发生异常)自动调用资源的 close() 方法,避免手动关闭遗漏导致的资源泄漏。
哪些资源能用 try-with-resources?
必须实现 java.lang.AutoCloseable 接口(或其子接口 Closeable),比如:
-
FileInputStream/FileOutputStream -
BufferedReader/BufferedWriter -
Connection、Statement、ResultSet(JDBC 4.1+) -
ZipInputStream、ObjectOutputStream等
基本写法:声明资源在 try 括号里
资源声明写在 try 后的圆括号中,用分号隔开多个资源。资源会在 try 块退出时按**声明逆序**自动关闭(后声明的先关闭):
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
String line = br.readLine();
System.out.println(line);
} // fis 和 br 自动关闭,无需 finally 块
异常处理细节:抑制异常(Suppressed Exception)
如果 try 块抛出异常,且资源关闭时也抛出异常,关闭异常会被“抑制”,主异常仍被抛出,但可通过 getSuppressed() 获取被抑制的异常:
立即学习“Java免费学习笔记(深入)”;
try (MyResource r = new MyResource()) {
r.doSomething(); // 抛出 IOException
} catch (IOException e) {
System.out.println("主异常: " + e);
for (Throwable s : e.getSuppressed()) {
System.out.println("被抑制的异常: " + s);
}
}
与传统 try-catch-finally 对比
传统写法容易漏关、重复关、或关闭时覆盖原异常;try-with-resources 更简洁安全:
- 不用手写
finally块和null判空 - 即使 try 中 return 或 throw,资源仍保证关闭
- 多资源自动按序关闭,逻辑清晰
注意:资源变量是隐式 final 的,不能在 try 块内重新赋值。










