8

和有什么区别

try {
     // action A
}
catch(Exception e) {
     // action B
}
finally {
     // action C
}

try {
     // action A
}
catch(Exception e) {
     // action B
}
// action C

我已经读到您可以从catch块内部返回并且仍然finally执行该块。还有其他区别吗?

4

6 回答 6

9

finally无论 try-catch-block 中发生什么,块内发生的事情都保证会发生。如果发生了未被封装的异常Exception(例如,extends Throwable,例如各种Errors),那么它仍然运行该finally块。

需要注意的一件事是:如果在finally块内RuntimeException抛出了 a,或者另一个Exception从其中逃脱,则块的其余部分finally不会执行。此外,正如 Torgamus 勋爵所指出的,这取决于 JVM 的运行情况。此外,很可能很明显,它还取决于线程是否被停止。

于 2011-04-29T15:45:13.737 回答
5

大多数现有答案都包含正确答案的片段,但没有一个是非常准确的。

如果 JVM 没有事先关闭,finally则始终保证在和潜在的块之后到达该块。但是,如果块内的一些代码关闭了 JVM,或者自己抛出了异常,则可能无法到达块的末尾。trycatchfinally

根据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 returnin thetry不会停止finally运行。实际上, is 是在遇到finally之后立即进入的,它执行之前。return

于 2011-04-29T15:51:34.807 回答
2

更好地看一下这个例子,即使我返回或传播 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 块有它的用法

于 2011-04-29T15:51:56.487 回答
1

来自Sun 教程

注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块将不会执行。同样,如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也不会执行。

我不知道finally块不会执行的任何其他方式......

于 2011-04-29T15:51:23.683 回答
0

finally如果 JVM 继续运行,则保证块内的代码可以执行。

这意味着即使操作 B 中的内容抛出另一个新异常或未捕获操作 A 中的异常或调用了 return,操作 C 中的代码也会运行。

于 2011-04-29T15:44:32.570 回答
0

try 块用于异常处理。如果有任何情况/代码会引发异常,例如,如果我们将一个数字除以零(0),那么它将引发异常并且进程将被关闭。在这种情况下,如果我们将代码放在 try 块中,则异常会被 catch 块捕获,并且不会终止进程。finally 阻止了执行那里编写的代码的保证。因此,如果我们必须终止/关闭进程,即使它的执行是否成功(例如,在网络编程的情况下,我们必须最后释放连接,以便其他设备可以使用该连接),我们使用 finally 块。

于 2011-04-29T16:46:05.960 回答