Skip to content

Try With Resources

你有没有被「忘记关闭流」这个问题坑过?文件锁释放不了,排查半天发现是 close 忘了写。try-with-resources 就是来解决这个的。

基本语法

JDK 7 引入的自动资源关闭语法。只要资源实现了 AutoCloseable 接口,就能在离开 try 块时自动关闭:

java
public class MyResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("资源关闭");
    }
}
java
public class TryWithResourcesDemo {

    public static void main(String[] args) {
        // 自动关闭资源
        try (BufferedReader reader = new BufferedReader(
                new FileReader("file.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 资源自动关闭
    }
}

多个资源

多个资源用分号分隔,关闭顺序是声明的相反顺序(先开后关):

java
public class MultipleResourcesDemo {

    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("in.txt");
             FileOutputStream fos = new FileOutputStream("out.txt")) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

自定义资源

只要实现 AutoCloseable,任何资源都能自动关闭:

java
public class CustomResourceDemo {

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

        @Override
        public void close() {
            System.out.println("关闭数据库连接");
        }
    }

    public static void main(String[] args) {
        try (DatabaseConnection db = new DatabaseConnection()) {
            db.query("SELECT * FROM users");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关闭顺序

出异常后,即使 catch 中也抛出异常,finally 仍然会执行。资源按声明的相反顺序关闭。

基于 VitePress 构建