【问题标题】:how to handle exception if finally follows try block如果 finally 遵循 try 块如何处理异常
【发布时间】:2010-10-30 09:44:46
【问题描述】:

如果我只放 finally 没有 catch 块将如何处理异常

【问题讨论】:

标签: java


【解决方案1】:

异常会向上调用堆栈,就好像你的try块不存在一样,除了finally中的代码会被执行。

一些示例代码

try {

   // an exception may be thrown somewhere in here

}
finally {
   // I will be executed, regardless of an exception thrown or not
}

【讨论】:

  • 根据 Stephen C 的回答中引用的 Java 语言规范中的示例,finally 块将被执行,无论如何,它将被执行 before 任何进一步的堆栈捕获它, 如果 finally 块异常退出(例如return),异常不会向上传播。
【解决方案2】:

您的异常不会被捕获,但最终会调用并执行“finally”块。您可以编写如下快速方法并查看:

public void testFinally(){ try{ throw new RuntimeException(); }finally{ System.out.println("Finally called!!"); } }

【讨论】:

  • finally 块无论如何都会执行,而不是最终!
  • 对,finally块会在异常传播之前执行
【解决方案3】:

如果我只放 finally 没有 catch 块将如何处理异常

在这种情况下,异常不会被捕获或处理。会发生什么,取决于finally 子句中发生的事情。

  • 如果finally 子句中的语句序列“正常”完成,原始异常将继续传播。
  • 如果finally 子句中的语句序列由于某种原因“突然”完成,那么整个try 语句将因那个 原因终止。突然终止包括抛出异常、执行returnbreakcontinue。在这种情况下,原始异常会丢失而不会被“处理”。

这有一些相当有趣的结果。例如,以下内容会压制 try 块中抛出的任何异常。

public void proc () {
    try {
        // Throws some exception
    } finally {
        return;
    }
}

带有finally子句的try语句的详细信息在JLS 14.20.2中列出

【讨论】:

  • 这似乎是唯一正确的答案。它肯定是唯一一个提供支持其主张的参考。
猜你喜欢
  • 2016-09-19
  • 2012-05-02
  • 1970-01-01
  • 2014-01-08
  • 2012-09-26
  • 1970-01-01
  • 2010-10-24
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多