在Java开发中,操作文件流、数据库连接、网络连接等资源时,如果忘记手动关闭资源,很容易造成资源泄露,长期运行后会导致系统性能下降甚至崩溃。下面我们来看如何使用try-with-resources特性解决这个问题。

try-with-resources的使用前提
要使用try-with-resources管理资源,对应的资源类必须实现java.lang.AutoCloseable接口,该接口只有一个close()方法,Java中大部分原生资源类都已经实现了这个接口,比如FileInputStream、Connection、BufferedReader等。
基础使用语法
try-with-resources的语法结构是在try关键字后紧跟一对圆括号,在圆括号内声明需要管理的资源,资源会在try代码块执行结束后自动关闭,无需手动编写关闭逻辑。
下面是读取文件内容的基础示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesDemo {
public static void main(String[] args) {
// 在try后的圆括号内声明资源,会自动关闭
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}管理多个资源
如果需要同时管理多个资源,可以在try后的圆括号内用分号分隔多个资源声明,关闭顺序和资源声明顺序相反,也就是最后声明的资源会最先关闭。
下面是同时操作输入流和输出流的示例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class MultiResourceDemo {
public static void main(String[] args) {
// 多个资源用分号分隔,关闭顺序和声明顺序相反
try (FileInputStream fis = new FileInputStream("source.txt");
FileOutputStream fos = new FileOutputStream("target.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}和传统try-catch-finally的对比
传统方式需要手动在finally块中关闭资源,还要处理关闭时的异常,很容易出现遗漏或者异常覆盖的问题,我们可以对比两种方式的实际代码:
| 对比项 | try-with-resources | 传统try-catch-finally |
|---|---|---|
| 关闭逻辑 | 自动关闭,无需手动编写 | 需要在finally块中手动编写关闭代码 |
| 异常覆盖 | 会抑制关闭时的异常,优先抛出业务异常 | 关闭时的异常可能覆盖业务异常,排查困难 |
| 代码冗余度 | 代码简洁,无多余关闭逻辑 | 代码冗长,需要判断资源是否为空再关闭 |
自定义资源类适配try-with-resources
如果是自定义的资源类,只需要实现AutoCloseable接口,重写close()方法,就可以使用try-with-resources管理,示例如下:
// 自定义资源类,实现AutoCloseable接口
class CustomResource implements AutoCloseable {
// 资源初始化逻辑
public CustomResource() {
System.out.println("自定义资源初始化");
}
// 资源业务方法
public void doWork() {
System.out.println("执行自定义资源业务操作");
}
// 重写close方法,编写资源关闭逻辑
@Override
public void close() throws Exception {
System.out.println("自定义资源关闭");
}
}
public class CustomResourceDemo {
public static void main(String[] args) {
try (CustomResource resource = new CustomResource()) {
resource.doWork();
} catch (Exception e) {
e.printStackTrace();
}
}
}注意事项
- 只有实现了
AutoCloseable接口的资源才能放在try-with-resources的圆括号中使用,否则会编译报错。 - try-with-resources中声明的资源默认是final的,不能在try代码块中重新赋值。
- 如果资源关闭时抛出异常,会被抑制,我们可以通过
Throwable.getSuppressed()方法获取被抑制的异常信息。
合理使用try-with-resources可以大幅减少资源泄露的概率,简化资源管理的代码逻辑,建议在处理需要关闭的资源时优先使用该特性。
try-with-resourcesJava资源泄露AutoCloseable资源管理异常处理修改时间:2026-05-25 21:50:03