这会在使用后释放我的资源吗?

时间:2014-10-26 03:13:57

标签: java memory-leaks

这会在使用后释放我的资源吗?

    InputStream inputStream;
    try (InputStream unverifiedStream = connection.getInputStream()){
        inputStream = unverifiedStream;
    } catch (Exception e) {
        e.printStackTrace();
    }
    //and use stream here to do other stuff with other streams

3 个答案:

答案 0 :(得分:3)

这将释放您的资源(关闭流)并让您与封闭的流进行对话。

对inputStream的赋值不会复制流对象。它将引用复制到流对象。您现在有两种不同的方式可以与同一个对象进行对话。

答案 1 :(得分:1)

由于您正在使用try-with-resource语句,并且如果通过"已发布"你是说"关闭"然后是的。

在try-with-resources语句中打开的任何实现AutoCloseable的实例都在.close()之前catch,所以在你的情况下,unverifiedStream将在你捕获之前关闭Exception

还应该注意Closeable扩展AutoCloseable,因此所有现有的实施Closeable的类都会#34}神奇地"在try-with-resources声明中工作。

示例代码:

public final class AutoCloseableExample
{
    private static final class Foo
        implements AutoCloseable
    {
        @Override
        public void close()
            throws IOException
        {
            System.out.println("foo");
            throw new IOException();
        }
    }

    public static void main(final String... args)
    {
        try (
            final Foo foo = new Foo();
        ) {
            System.out.println("try block");
        } catch (IOException ignored) {
            System.out.println("exception!");
        } finally {
            System.out.println("finally block");
        }
    }
}

输出:

try block
foo
exception!
finally block

附注:您应该捕获Exception,因为这也会捕获所有未经检查的异常(即RuntimeException和衍生物)。相反,请抓住更具体的例外。

答案 2 :(得分:0)

我还没试过这个,但是如果你尝试在try-catch块之后使用inputStream,我认为它不会编译,因为inputStream赢了'如果connection.getInputStream()抛出异常,则初始化。您的catch块应该分配一个值或引入不同的控制流来处理这种可能性。

如果try块正常完成,inputStream将引用try-catch块之外的闭合流,并且大多数实现将对您在流上尝试的任何操作抛出异常。