当我们可以关闭文件和所有的catch块时,还需要finally块吗?



当我们可以关闭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块将不会被执行,你结束不关闭文件

相关内容

  • 没有找到相关文章

最新更新