之间有什么区别
try {
// action A
}
catch(Exception e) {
// action B
}
finally {
// action C
}
和
try {
// action A
}
catch(Exception e) {
// action B
}
// action C
我已经读过你可以从catch
块内部返回并仍然执行finally
块。还有其他差异吗?
答案 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)
注意:如果JVM在尝试时退出 或者正在执行catch代码 finally块不会执行。 同样,如果线程执行 尝试或捕获代码被中断或 杀了,终于阻止了 即使应用程序执行也执行 整体还在继续。
我不知道finally块不会执行任何其他方式......
答案 4 :(得分:0)
如果JVM继续运行,finally
块内的代码将保证执行。
这意味着即使操作中的B抛出另一个新异常或者没有捕获操作A中的异常或者调用了返回,操作C中的代码也会运行。
答案 5 :(得分:0)
try块用于异常处理。如果有任何case /代码会抛出异常,例如,如果我们将一个数字除以零(0)而不是抛出一个异常,那么该进程将被关闭。在这种情况下,如果我们将代码放在try块中,而异常是catch块捕获,则进程将不会终止。并最终阻止执行写在那里的代码的保证。因此,如果我们必须终止/关闭进程,即使它的执行成功与否(例如,在网络编程的情况下,我们必须最后释放连接,以便其他设备可以使用该连接),我们使用finally块。 / p>