Java尝试使用参数资源

时间:2017-03-24 11:11:55

标签: java try-catch

这是一个愚蠢的问题,但我无法弄明白。 我是否需要在使用资源的try中关闭作为参数传递的Object?

这是一个例子:

StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
    ...
}

我是否需要致电

sw.close();
尝试阻止之后

?或者它是否自动关闭作为参数传递的所有Autocloseable对象?

5 个答案:

答案 0 :(得分:3)

closePrintWriter的隐式调用实际上也会关闭基础Writer

参见以下示例:

StringWriter sw = new StringWriter() {
        @Override
        public void close() throws IOException {
            super.close();
            System.out.println("closed");
        }
};
try (PrintWriter pw = new PrintWriter(sw)) {};

<强>输出

closed

答案 1 :(得分:0)

添加一个finally块并关闭传递的对象。这是因为无论是否存在异常,都会始终执行block。

StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
    ...
}finally{
 sw.close();
}

答案 2 :(得分:0)

您可以在try-with-resources初始化块中放置多个项目:

try (final StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
    // ...
} catch (IOException e) {
    // ...
}

它们都将自动关闭。

答案 3 :(得分:0)

PrintWriter的{​​{1}}方法也会关闭close(但是......是的,那里没有任何内容可以关闭)。这不是其他包装纸的常见情况。

您可以在StringWriter块中传递两个对象,以确保它们将被关闭:

try

答案 4 :(得分:0)

由于这两个类都实现了AutoClosable接口,您可以尝试类似下面的内容。它会自动关闭这两个对象。

try(
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw)
) { ... }