这会在使用后释放我的资源吗?
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
答案 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块之外的闭合流,并且大多数实现将对您在流上尝试的任何操作抛出异常。