当我们可以关闭finally
块中的文件时,catch
块的需要是什么。
无论我们在finally
块中关闭或清除什么内容,都可以在catch
块中完成。如果我错了,请告诉我。
答案 0 :(得分:6)
无论是否抛出异常,您通常都希望执行相同的清理操作。使用catch块执行只是是很痛苦的 - 特别是如果你想确保只调用close()
一次,即使 抛出。你最终得到了:
bool closeCalled = false;
OutputStream stream = ...;
try {
stream.write(...);
closeCalled = true;
stream.close();
} catch (IOException e) {
if (!closeCalled) {
// TODO: Add another try/catch here? What do we want to
// do if this throws?
stream.close();
}
throw e;
}
将其与:
进行比较OutputStream = ...;
try {
stream.write(...);
} finally {
// TODO: Still need to work out what to do if this throws.
stream.close();
}
或者最好:
try (OutputStream stream = ...) {
stream.write(...);
}
就我个人而言,我认为最后一个例子到目前为止是最干净的 - 你真的想要到处都是第一块代码吗?哦,这是一个简单的例子 - 我们只捕获一个例外。想象一下,在每个catch
子句中重复该代码,并且如果有多种方法退出try
块,那么重复每个的关闭调用...... ick。
此外,正如尼古拉斯在评论中指出的那样,所有那些未经检查的例外情况都是你 捕获的(并且抓住和重新抛出可能会很痛苦)。从根本上说,"我只是想清理我的资源,无论发生什么事情"是非常非常引人注目的......
答案 1 :(得分:0)
仅当当我们可以关闭文件和catch块中的所有内容时,finally块的需要是什么。我们在finally块中关闭或清除的任何东西都可以在catch块中完成
catch
块中出现异常时,才会执行 try
块。
如果你想每次都做一些操作,比如清理,你需要在finally
块中编写代码。
最后将始终执行,并且不会始终执行catch块。
考虑下面的例子,
你打开了一个文件并尝试复制到try
块中的另一个文件,如果代码执行正常,则不会执行catch块而你不会关闭文件