我正在使用Java SDK8,我创建了一个inputStream和outputStream对象。
在Java SE 7之前,我可以使用finally块来确保关闭这些资源,无论try语句是否正常完成。 我在Java SE 7及更高版本中读到,我可以使用try-with-resources语句,如果我正在使用的资源实现了接口java.lang.AutoCloseable,我不需要在finally块中关闭此资源更多。
我的问题是:
1.如果我使用的是实现接口java.lang.AutoCloseable的资源,我是不正确的,我不需要在finally块中关闭它,即使抛出异常也会关闭它?如果是这样,是否有必须存在的先决条件? (例如在try块中创建资源?)
2. try-with-resources语句究竟意味着什么?
提前多多感谢!!
答案 0 :(得分:2)
- 如果我正在使用实现java.lang.AutoCloseable接口的资源,我是不是需要在finally块中关闭它,即使抛出异常也会关闭它?
醇>
是
如果是这样,是否存在必须存在的前提条件? (例如在try块中创建资源?)
必须在try-with-resources语句中创建资源(见下文)。
- try-with-resources语句究竟意味着什么?
醇>
这是一个try-with-resources声明:
try (FileReader fr = FileReader(path)) {
// use fr here
}
请注意FileReader
的初始化 <{1}}(在新的try
部分中)。这就是声明如何知道以后需要关闭的内容。
(the tutorial中的更多内容,虽然我不喜欢他们的第一个例子,因为它依赖于A)()
构造函数从不抛出的事实,以及B)事实{{1}当BufferedReader
关闭时,我会关闭BufferedReader
。这些对于FileReader
都是正确的,但在一般情况下它是一个糟糕的例子。)
完整的细节,包括BufferedReader
格式的BufferedReader
内容的翻译,位于the specification。
请注意,您可以在语句中创建多个资源;它们以创建的相反顺序关闭:
try-with-resources
虽然你可以写:
try/catch/finally
...您必须知道肯定 try (
FileReader fr =
new FileReader(fileName);
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(fr)
) {
// ...use `nifty` here
}
从不抛出异常,try (
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(new FileReader(fileName))
) {
// ...use `nifty` here
}
将关闭基础NiftyThingUsingReader(FileReader)
,因为它将不由try-with-resources本身处理。如果您不确定,请将它们分开,以便try-with-resources语句关闭NiftyThingUsingReader#close
即使FileReader
构造函数抛出,即使FileReader
未关闭它
资源不必相互依赖(直接);例如,这是一种相当常见的情况,您希望处理输入和输出:
NiftyThingUsingReader(FileReader)