跳转到主要内容
模块 5 · 第 2 课(共 2)课程中的10/14~12 min
模块课程(2/2)

尝试资源

在旧版本的 Java 中,管理需要显式关闭的资源(例如文件、数据库连接或网络流)需要强制的 finally 块来确保它们已关闭。这导致了冗长且容易泄漏的代码。

Java 7 引入了 try-with-resources 语句,该语句保证自动关闭在 try 块中声明的所有资源,前提是它们实现了 AutoCloseable 接口。

语法

资源在 try 关键字之后的括号内声明和初始化。

Java
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occurs

声明多个资源

您可以在同一个 try 块内实例化多个资源,并用分号 ; 分隔它们。资源将按照其声明的相反顺序关闭。

Java
try (
    FileReader fr = new FileReader("input.txt");
    FileWriter fw = new FileWriter("output.txt")
) {
    // Use resources
} catch (IOException e) {
    System.out.println("Error: " + e.getMessage());
}

创建自定义资源

只要自定义资源实现 java.lang.AutoCloseable 并覆盖 close() 方法,就可以在 try-with-resources 块中使用。

Java
public class DatabaseConnection implements AutoCloseable {
    public void query(String sql) {
        System.out.println("Running query: " + sql);
    }

    @Override
    public void close() {
        System.out.println("Connection closed!");
    }
}

自己尝试一下

锻炼#java.m5.l2.e1
尝试:0加载中...

使用 try-with-resources 语句完成 readFile 方法,以初始化包装路径上 FileReader 的 BufferedReader。在 catch 块中,拦截 IOException 并打印“读取文件时出错”。

正在加载编辑器...
显示提示

在“try”之后的括号中声明“BufferedReader”,并实现“IOException”处理。

3 次尝试后可用的解决方案

锻炼#java.m5.l2.e2
尝试:0加载中...

在 try-with-resources 块内实例化自定义资源 CustomResource,对其调用 doWork() 方法,并通过打印“Error”来处理异常。

正在加载编辑器...
显示提示

使用 try (CustomResource res = new CustomResource()) 并在其中调用 res.doWork(); 。

3 次尝试后可用的解决方案

锻炼#java.m5.l2.e3
尝试:0加载中...

在同一个 try-with-resources 构造中声明 FirstResource 和 SecondResource。通过打印“Error”来处理异常。

正在加载编辑器...
显示提示

使用分号“;”分隔“try”括号内的两个资源的声明。

3 次尝试后可用的解决方案