终于和最后没有什么区别?

Sid*_*dor 7 java finally

有什么区别

try {
     // action A
}
catch(Exception e) {
     // action B
}
finally {
     // action C
}
Run Code Online (Sandbox Code Playgroud)

try {
     // action A
}
catch(Exception e) {
     // action B
}
// action C
Run Code Online (Sandbox Code Playgroud)

我已经读过你可以从catch块内部返回并仍然finally执行块.还有其他差异吗?

pic*_*ypg 9

finally无论try-catch-block中发生什么,都可以保证块内发生的事情发生.如果发生未被Exception(例如,扩展Throwable,例如各种Errors)封装的异常,则它仍然运行该finally块.

有一点要注意的:如果在中finally块,一个RuntimeException被抛出,或另一个Exception从内部泄漏出来,那么剩下的的finally块将执行.此外,正如Lord Torgamus指出的那样,它取决于JVM的运行.此外,很明显,它也取决于线程没有被停止.


Pop*_*ops 5

大多数现有答案都包含正确答案的部分,但没有一个是完全正确的.

finally块始终保证将达成try和潜在catch如果JVM不关机事先块.但是,如果finally块中的一些代码关闭了JVM,或者抛出了自己的异常,则可能无法到达块的末尾.

根据Sun认证的Java 6程序员学习指南:

  • finally-will-always-be-called规则的唯一例外是,finally如果JVM关闭,则不会调用a .

  • 仅因为finally被调用并不意味着它将完成.

最后一句话是Java语言规范.finally§14.20.2执行try-catch-finally中详尽解释了行为.

作为一个额外注:你说的没错,一个returntry不会停止finally运行.实际上,finallyreturn遇到之后立即进入,然后才执行.


Zom*_*ies 0

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

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