和有什么区别
try {
// action A
}
catch(Exception e) {
// action B
}
finally {
// action C
}
和
try {
// action A
}
catch(Exception e) {
// action B
}
// action C
我已经读到您可以从catch
块内部返回并且仍然finally
执行该块。还有其他区别吗?
finally
无论 try-catch-block 中发生什么,块内发生的事情都保证会发生。如果发生了未被封装的异常Exception
(例如,extends Throwable
,例如各种Error
s),那么它仍然运行该finally
块。
需要注意的一件事是:如果在finally
块内RuntimeException
抛出了 a,或者另一个Exception
从其中逃脱,则块的其余部分将finally
不会执行。此外,正如 Torgamus 勋爵所指出的,这取决于 JVM 的运行情况。此外,很可能很明显,它还取决于线程是否被停止。
大多数现有答案都包含正确答案的片段,但没有一个是非常准确的。
如果 JVM 没有事先关闭,finally
则始终保证在和潜在的块之后到达该块。但是,如果块内的一些代码关闭了 JVM,或者自己抛出了异常,则可能无法到达块的末尾。try
catch
finally
根据Sun Certified Programmer for Java 6 Study Guide:
finally
-will-always-be-call 规则的唯一例外是,finally
如果 JVM 关闭,则不会调用 a。仅仅因为
finally
被调用并不意味着它会完成。
与往常一样,最后一个词是Java 语言规范。的行为在§14.20.2 执行 try-catch-finallyfinally
中有详尽的解释。
作为一个额外的说明:你是对的, a return
in thetry
不会停止finally
运行。实际上, is 是在遇到finally
之后立即进入的,在它执行之前。return
更好地看一下这个例子,即使我返回或传播 Excpetion,资源也总是关闭的。
try {
//action A
return 0;
} catch (Exception e){
//action C
throw new Excpetion("Probleme here",e)
} finnaly {
//action C
resources.close();
}
如果 action A 和 be 和 int a = 0 一样原始,那么没有区别,但是在像这样更复杂的情况下,finnaly 块有它的用法
来自Sun 教程
注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块将不会执行。同样,如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也不会执行。
我不知道finally块不会执行的任何其他方式......
finally
如果 JVM 继续运行,则保证块内的代码可以执行。
这意味着即使操作 B 中的内容抛出另一个新异常或未捕获操作 A 中的异常或调用了 return,操作 C 中的代码也会运行。
try 块用于异常处理。如果有任何情况/代码会引发异常,例如,如果我们将一个数字除以零(0),那么它将引发异常并且进程将被关闭。在这种情况下,如果我们将代码放在 try 块中,则异常会被 catch 块捕获,并且不会终止进程。finally 阻止了执行那里编写的代码的保证。因此,如果我们必须终止/关闭进程,即使它的执行是否成功(例如,在网络编程的情况下,我们必须最后释放连接,以便其他设备可以使用该连接),我们使用 finally 块。