【问题标题】:What is the functionality of a "finally" block?“finally”块的功能是什么?
【发布时间】:2013-08-17 01:37:36
【问题描述】:
class Demo {
    public static void main(String args[]) {
        System.out.println("Start main");
        try {
            //exceptional code
            int x=43/0;
        } catch(ArithmeticException e) {
            e.printStackTrace();
        } finally {
            System.out.println("final code");
        }
        System.out.println("End main");
    }
}

我使用上面的代码来了解finally 块的机制。在这种情况下,我观​​察到即使没有那个 catch 块,finally 块也会执行并显示发生了异常。但我观察到的不同之处在于,当不使用 catch 块时,不会打印“End main”。我想知道即使没有使用 catch 子句处理异常,finally 块也会执行的原因。我想知道 finally 块的基本功能是什么。

【问题讨论】:

  • 因为这就是它的设计目的。无论是否引发Exception,都保证会调用finally 块。更多详情请关注The finally block
  • @MadProgrammer-是的,这是一个很好的提示......我认为这是机制,我想确保我所想的是真正发生的事情。
  • 我会用它来清理在该函数中使用的系统资源,如文件关闭、数据库连接关闭等,因此无论您的程序以何种方式结束,正常或异常,资源都将是释放。

标签: java try-catch-finally


【解决方案1】:

无论是否有异常,最后都会使用块来运行代码。 finally 总是针对相关的 try 块执行。

一般finally用来关闭在try块中打开的资源。在 finally 中这样做的原因是,无论有没有异常,我们都应该关闭资源。但是在 Java 7 中,如果您将 try with resource 用于 AutoCloseable 资源,您真的不需要为此烦恼。

在您的代码中,finally 的相关性仅在于了解 finally 如何工作。

了解有关 finally 的更多信息:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

以及来自同一链接的注释:

重要:finally块是防止资源占用的关键工具 泄漏。关闭文件或以其他方式恢复资源时,放置 finally 块中的代码,以确保资源始终 恢复了。

如果您使用的是 Java SE 7 或更高版本,请考虑使用 在这些情况下使用 try-with-resources 语句,它会自动 在不再需要时释放系统资源。

【讨论】:

  • Try-with-resource 仅在您要关闭的资源实现 AutoCloseable 时才可用。
  • @Makoto 感谢 Makato,现在明确提到 :-)
  • @Juned- 你能告诉我一些有用的链接来关注上述主题,并让我自己清楚 try、catch 和 final 块背后的真正概念吗?
  • @Vbabey 刚刚直接从 oracle 添加了链接 :-)
  • @Vbabey 谢谢!,如果我的回答对您有帮助,请点击我回答左侧的勾号接受它。接受答案的做法有助于其他面临同样问题/困惑的人。
【解决方案2】:

无论在 trycatch 块上发生什么,finally 原因都会确保*为您执行。

*只有在 Threadtry / catch 块中运行时中断或杀死当前 Thread 块才会执行。

这里是更具体的docs

【讨论】:

    【解决方案3】:

    来自Java Tutorials

    finally 块总是在 try 块退出时执行。这样可以确保即使发生意外异常也会执行 finally 块。但是 finally 不仅仅对异常处理有用——它允许程序员避免清理代码被 return、continue 或 break 意外绕过。将清理代码放在 finally 块中始终是一种很好的做法,即使没有预料到异常也是如此。

    因此,如果您必须保证某个操作正在执行,例如somePrintWriter.close(),但仍想在此之前处理任何异常,finally 块将执行它。

    【讨论】:

      【解决方案4】:

      在 Java 中使用 try-catch-finally 块或 try-with-resources 块来实现与 C++ 中的对象终结器类似的功能。

      虽然它们用于异常处理,但finally 语句块最重要的功能可能是关闭或释放在执行try 块中的代码期间打开或创建的资源。

      请注意,Java 中存在对象终结器(以某种方式存在),但它们几乎不应该用于终结对象……很奇怪,是吗?

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 2011-03-07
        • 2021-06-24
        • 2018-12-28
        • 2013-05-18
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多