Java 7 try-with-resources - 什么可以在try子句中

时间:2017-06-19 15:45:32

标签: java try-catch

我知道必须有一个与try子句中的资源相关联的变量声明。

但是,除了分配通常的资源实例化之外,是否可以为其分配已经存在的资源,例如:

public String getAsString(HttpServletRequest request) throws Exception {   
    try (BufferedReader in = request.getReader(); ){ 
        etc 
    } 
}

即。 BufferedReader会自动关闭,就像直接在try子句中实例化的资源一样吗?

3 个答案:

答案 0 :(得分:4)

即可。任何AutoCloseable的内容都会调用close方法。 try-with-resource会做到这一点。

答案 1 :(得分:2)

我们可以使用此代码测试是否为真:

class Main {
    public static void main(String[]args) throws Exception {
        AutoCloseable _close = getCloseable()
       try (AutoCloseable close = _close) {
           // ...
       }

    }

    public static AutoCloseable getCloseable() {
        return new MyCloseable();
    }
}

class MyCloseable implements AutoCloseable {

    @Override
    public void close() {
        System.out.println("Closing");
    }
}

输出结果为"结束"。这意味着,在AutoCloseable块之前创建的try确实仍会在try块之后关闭。

实际上,只要它实现(),Java就不关心你放在try块的AutoCloseable中的内容。在运行时,表达式将自动计算为一个值,无论它是否为new表达式。

答案 2 :(得分:1)

是的,BufferedReader将自动关闭。

从Java 7开始,接口AutoCloseable被添加为Closeable的SuperInterface,因此所有实现的Closeable类(即资源类)接口都会自动继承AutoCloseable接口。