try…​with…​resources语句

Java 7 提供了一个新的异常处理机制:try…with…resources 语句。它能够很容易地关闭在 try-catch 语句中使用的资源。这些资源指的是在程序运行结束后,必须关闭的对象。也就是说,try-with-resources 语句确保了每个资源在程序运行结束后都会被关闭。下面将从两个方面演示 try-with-resources 语句的使用方法。

关闭一个资源

如果一个资源对象是在 try…with…resources 语句中声明的,那么 AutoCloseable 接口中的 close() 方法就会自动执行。也就是说,JVM 会自动调用 close() 方法关闭资源。

例如,定义一个实现 AutoCloseable 接口的 Resource 类。在 Resource 类中,包含一个用于执行任务的 doTask() 方法和重写的 close() 方法。定义一个用于测试的 Test 类,使用 try…with…resources 语句实现自动关闭资源的功能。代码如下:

class Resource implements AutoCloseable {
    void doTask() {
        System.out.println("执行任务");
    }

    @Override
    public void close() throws Exception {
        System.out.println("关闭资源");
    }
}

public class Test {
    public static void main(String[] args) {
        try (Resource r = new Resource()) {
            r.doTask();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

     执行任务
     关闭资源

关闭多个资源

例如,定义实现 AutoCloseable 接口的 ResourceOne 类和 ResourceTwo 类。在 ResourceOne 类中,包含一个用于执行任务1的 doTaskOne() 方法和重写的 close() 方法;在 ResourceTwo 类中,包含一个用于执行任务2的 doTaskTwo() 方法和重写的 close() 方法。定义一个用于测试的 Test 类,对 ResourceOne 类和 ResourceTwo 类使用 try…with…resources 语句实现自动关闭资源的功能。代码如下:

class ResourceOne implements AutoCloseable {
    void doTaskOne() {
        System.out.println("执行任务1");
    }

    @Override
    public void close() throws Exception {
        System.out.println("关闭资源1");
    }
}

class ResourceTwo implements AutoCloseable {
    void doTaskTwo() {
        System.out.println("执行任务2");
    }

    @Override
    public void close() throws Exception {
        System.out.println("关闭资源1");
    }
}

public class Test {
    public static void main(String[] args) {
        try (ResourceOne ro = new ResourceOne();
                ResourceTwo rt = new ResourceTwo()) {
            ro.doTaskOne();
            rt.doTaskTwo();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

     执行任务1
     执行任务2
     关闭资源2
     关闭资源1