Tag: 尝试与资源

为什么try-with-resource需要一个局部variables?

引用我的问题java.util.concurrent.locks.Lock的AutoCloseable包装中的任何风险? ,我想知道为什么TRH try-with-resource需要一个命名的局部variables。 我目前的用法如下: try (AutoCloseableReentrantReadWiteLock.Lock l = _lock.writeLock()) { // do something } variablesl在try块内未被使用,只会污染名字空间。 从我记得的类似的C# using语句不需要本地命名variables。 是否有任何原因,以下不能被支持,与一个匿名的本地variables,在try块结束时closures? try (_lock.writeLock()) { // do something }

在try-with-resources块中pipe理多个链接资源的正确习惯用法?

Java 7 try-with-resources语法(也称为ARM块( 自动资源pipe理 ))在使用一个AutoCloseable资源时很好,简单明了。 然而,我不确定什么是正确的习惯用法,当我需要声明多个相互依赖的资源,例如一个FileWriter和一个BufferedWriter包装它。 当然,这个问题涉及到一些AutoCloseable资源被封装的情况,不仅仅是这两个特定的类。 我提出了以下三个备选scheme: 1) 我见过的天真的习惯用法是只声明ARMpipe理的variables中的顶层包装: static void printToFile1(String text, File file) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) { bw.write(text); } catch (IOException ex) { // handle ex } } 这很好,很短,但是坏了。 因为底层的FileWriter没有在variables中声明,它永远不会直接在生成的finally块中closures。 它只会通过包装BufferedWriter的close方法来closures。 问题是,如果从bw的构造函数抛出exception,它将不会被调用,因此底层的FileWriter 将不会被closures 。 2) static void printToFile2(String text, File file) { try (FileWriter fw = new […]