【问题标题】:About finally block [duplicate]关于finally块[重复]
【发布时间】:2014-05-22 20:39:57
【问题描述】:

我知道finally 的目的是保证某些指令或清理代码得到执行。但是使用finally 或将代码放在catch 块之后的实际区别是什么。
我的意思是,给我一个你需要使用finally 的例子,否则代码可能根本无法执行。

【问题讨论】:

  • finally 块执行,即使您抛出而不捕获,或者捕获并重新抛出,或 returntry{ throw new Error(); } finally { "do somehting"} 仍然运行 finally。
  • 我可以得到每个场景的代码示例

标签: java try-catch-finally finally try-finally


【解决方案1】:

不管 catch 块中发生了什么,最终都会执行。有几种情况。

catch(Exception E)
{
    ...
    throw new OtherException(BetterMessage, E);
}

catch { return null; }

catch { SomeMethodThatWillThrowAnException(); }

因此,即使您返回或抛出异常以退出 Catch 块,您仍然会执行 finally 块,而任何仅在 try-catch 之后的代码都将被忽略。

【讨论】:

  • 还有try { return; } ... 案例,正如@Petros P 建议的那样,还有exit() 案例。
【解决方案2】:

无论如何,最终都会执行。

一个例子

public void test() {
    try { 
       int x = 0;
       return;
    } catch(Exception ex) { 
       ex.printStackTrace();
    } finally { 
      System.out.println("Hello from finally");
    }  

    System.out.println("Hello from after catch");
}

在这种情况下,“Hello from after catch”不会被打印,但“Hello from finally”会。

【讨论】:

    【解决方案3】:

    无论如何,finally 块都会触发,即使你投掷和接球也是如此。放置在 catch 之后但不在 finally 块中的代码可能不会执行,例如,如果您的 catch 可能导致进程结束或应用程序崩溃。

    【讨论】:

    • 我明白了。如果应用程序崩溃,我想要运行什么样的代码?这其实是我最感兴趣的
    • 确保在某处记录了有关崩溃的信息。尝试向另一个进程发出有关失败的警报。保存您仍然可以保存的任何用户数据。尝试重新启动应用程序。无论你想要什么——这更多是一个架构决定; FINALLY 块绝对不是总是必要的,因为在某些情况下它肯定不会在上下文中使用。
    【解决方案4】:

    无论是否抛出异常,都会执行finally 块。

    您的问题是,使用finally 和将代码放在catch 块之后有什么区别。如果抛出异常,catch 块之后的代码将不会被执行。如果您将代码放在finally 块中,它会。

    【讨论】:

      【解决方案5】:

      可能会发生一些您无法捕捉到的异常。 finally 块保证即使抛出意外异常也能执行其中的代码。

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        相关资源
        最近更新 更多