【问题标题】:Is there such case when in try\finally block the finally won't be executed?在 try\finally 阻止 finally 不会执行时是否存在这种情况?
【发布时间】:2010-08-14 17:21:44
【问题描述】:

我正在学习面向对象编程的测试,我想知道是否有任何情况可以考虑以下代码:

try {
    do something
} catch (someException e) {

} finally {
    do something
}

finally 块不会执行?

【问题讨论】:

标签: java exception try-catch-finally finally


【解决方案1】:

是的。如果您使 Java VM 崩溃或通过本机代码搞砸了,导致程序终止,或在 try 块内无限循环/等待。

只有这三种情况可以避免执行finally 块。

【讨论】:

  • 调用 System.exit 或关闭计算机可能算作“导致程序终止”... :-)
  • 如果在try块中,你从包含这个try/catch/finally短语的函数返回,finally块还会执行吗?
  • @euphoria: 是的,当然,这是交易的一部分,当相应try 块内的代码在正常情况下(包括正常异常)退出时,保证执行finally 块)
  • 吹毛求疵:如果 catch 块在 finally 之前执行,并且无限循环/等待也将阻止执行到达 finally 块。除此之外,我认为你得到了所有情况:-)
【解决方案2】:

如果您在try 中调用System.exit(0)。或者做一些使 JVM 退出或挂起的事情(比如死锁)。否则 - 不。

【讨论】:

    【解决方案3】:

    Java 语言规范guarantees 在 try 语句完成之前最终被调用。

    由于 Borealid 的回答中已列举的常见原因,try 语句可能无法完成。

    【讨论】:

    • "最终在 try 语句完成之前被调用" ??? “之前”不应该是“当”
    • 一个try-语句由try-、任何catch块和一个可选的finally块组成。
    【解决方案4】:

    如果控制从 try 或 catch 块中出来,finally 块肯定会被执行。如果你有一些方法可以阻止控制从这些块中出来:

    • 通过编写退出语句,或

    • 无限循环等

    那么finally块将不会被执行。 通常我们为“cleanup”的目的编写 finally 块。

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 1970-01-01
      • 2012-09-07
      • 2010-09-11
      • 2014-07-11
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2014-08-29
      相关资源
      最近更新 更多