当我们可以关闭catch
块中的所有文件时,finally
块需要什么?我们在finally
块中关闭或清除的任何东西都可以在catch
块中完成。如果我错了,请告诉我。
无论是否抛出异常,您通常都希望执行相同的清理操作。用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
块的方法,那么也要重复每个方法的关闭呼叫……我吐! 此外,正如Nicolas在评论中指出的那样,存在所有那些无法捕获的未检查异常(并且捕获和重新抛出可能会很痛苦)。从根本上说,"无论发生什么,我只想清理我的资源"的原则是非常非常有说服力的。
当我们可以关闭文件和所有的catch块时,还需要finally块吗?无论我们在finally块中关闭或清除什么都可以在catch块
中完成吗?
catch
块只有在try
块出现异常时才会执行。
当你想每次做一些操作,比如清理,你需要在finally
块中编写代码。
Finally将永远执行,catch块将永远不执行。
考虑下面的例子,
你打开了一个文件,并试图复制到另一个文件在try
块,如果代码执行良好,catch块将不会被执行,你结束不关闭文件