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

时间:2011-04-29 15:42:02

标签: java finally

之间有什么区别
try {
     // action A
}
catch(Exception e) {
     // action B
}
finally {
     // action C
}

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

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

6 个答案:

答案 0 :(得分:9)

无论try-catch-block中发生什么,finally块内发生的事情都会发生。如果发生的异常未被Exception封装(例如,扩展Throwable,例如各种Error s),则运行{{1}阻止。

要注意的一件事是:如果在finally块中抛出finally或其他RuntimeException从其中逃脱,则休息Exception块的em>将执行。此外,正如Lord Torgamus指出的那样,它取决于JVM的运行。此外,很明显,这也取决于线程没有停止。

答案 1 :(得分:5)

现有的大部分答案都包含正确答案的部分,但没有一部分是正确答案。

如果JVM未事先关闭,则finally阻止始终保证在<{1}}和try阻止之后达到。但是,如果catch块中的一些代码关闭了JVM,或者抛出了它自己的异常,则可能无法到达块的末尾。

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

  
      
  • finally - 将永远被调用的规则的唯一例外是,如果JVM关闭,则不会调用finally

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

  •   

最后一句话一如既往地是 Java语言规范finally中详尽解释了finally的行为。

作为额外说明:return中的try不会阻止finally运行,这是对的。事实上,finally会在遇到return后立即输入,会在执行之前输入。

答案 2 :(得分:2)

更好地看一下这个例子,即使我返回或传播Excpetion,资源也会全部关闭。

try {
 //action A
 return 0;
} catch (Exception e){
 //action C
 throw new Excpetion("Probleme here",e)
} finnaly {
 //action C
 resources.close();
}

如果动作A和be与int a = 0一样,则没有区别,但在更复杂的情况下,finnaly块有它的用法

答案 3 :(得分:1)

来自Sun Tutorials

  

注意:如果JVM在尝试时退出   或者正在执行catch代码   finally块不会执行。   同样,如果线程执行   尝试或捕获代码被中断或   杀了,终于阻止了   即使应用程序执行也执行   整体还在继续。

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

答案 4 :(得分:0)

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

这意味着即使操作中的B抛出另一个新异常或者没有捕获操作A中的异常或者调用了返回,操作C中的代码也会运行。

答案 5 :(得分:0)

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