2017-06-19 42 views
1

我知道在try子句中必须存在与资源相关的变量声明。Java 7 try-with-resources - 什么可以在try子句中

但是也被分配一个通常的资源实例,可能它,而不是被分配一个已经存在的资源如:

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

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

+0

你试过了吗? – bradimus

+0

你的问题有点不清楚 - 如果你在try块中声明了一个可关闭的资源(你写的“etc”),它将不会被关闭。 – assylias

回答

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"); 
    } 
} 

输出为“关闭”。这意味着在try块之前创建的AutoCloseable确实会在try块之后仍然关闭。

实际上,Java并不关心你在try块的()中放什么,只要它实现了AutoCloseable即可。在运行时,表达式将自动评估为一个值,不管它是否为new表达式。

+0

@AndyThomas“已经存在”甚至意味着什么?我认为这意味着它意味着“根据上下文判断”()“中没有实例化的任何东西。 – Sweeper

+0

@AndyThomas编辑。 – Sweeper

4

。任何是AutoCloseable的将调用close方法。尝试与资源将做到这一点。

1

是的,BufferedReader会自动关闭。

由于Java 7,接口AutoCloseable加入作为Closeable一个超接口,因此所有实现类Closeable(即资源类)接口自动继承AutoCloseable接口。

相关问题