当我们可以关闭文件和catch块中的所有内容时,finally块的需要是什么

时间:2016-09-23 08:13:01

标签: java exception exception-handling try-catch-finally

当我们可以关闭finally块中的文件时,catch块的需要是什么。 无论我们在finally块中关闭或清除什么内容,都可以在catch块中完成。如果我错了,请告诉我。

2 个答案:

答案 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块而你不会关闭文件