try-with-resources可自动关闭autocloseable资源,按声明逆序调用close(),支持多资源管理、异常抑制及java 9+变量复用,资源隐式final且不可手动关闭。

Java 中使用 try-with-resources 可以自动关闭实现了 AutoCloseable 接口的资源(如文件流),避免手动调用 close(),也防止因异常导致资源泄漏。
确保资源类型支持自动关闭
只有实现了 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见的如:
-
FileInputStream/FileOutputStream -
BufferedReader/BufferedWriter Scanner-
ZipInputStream等
自定义类只需实现 AutoCloseable 并重写 close() 方法即可。
基本语法:在 try 后括号中声明资源
资源在括号中声明,用分号分隔;try 块结束时,JVM 自动按声明逆序调用 close(),即使发生异常也会执行。
示例:读取文本文件
try (FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} // br.close() 和 fr.close() 自动调用
多个资源或需要捕获异常时的处理
可以同时管理多个资源,它们会按声明**相反顺序**关闭(后声明的先关闭,保证依赖关系正确)。如果 try 块抛出异常,且 close() 也抛异常,后者会被抑制(suppressed),可通过 getSuppressed() 获取。
建议显式捕获并处理可能的异常:
try (FileInputStream fis = new FileInputStream("data.bin");
DataInputStream dis = new DataInputStream(fis)) {
int value = dis.readInt();
System.out.println(value);
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
注意点和常见误区
- 资源变量是隐式
final的,不能在 try 块内重新赋值 - 不要在 try 块里手动调用
close(),否则可能重复关闭引发异常 - 如果资源是方法参数传入的,不能直接写在 try 括号里(需提前声明或使用局部变量)
- Java 9+ 支持将已声明的
final或 effectively final 变量直接写入括号,更灵活
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











