“最终”块的功能是什么?

时间:2013-08-17 01:37:36

标签: java try-catch-finally

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”。我想知道finally块执行的原因,即使未使用catch子句处理异常。我想知道finally块的基本功能是什么。

4 个答案:

答案 0 :(得分:5)

最后,无论是否存在异常,都使用块来运行代码。最后总是执行相关的try块。

通常最终用于关闭try块中打开的资源。最后这样做的原因是,无论是否有例外,我们都应该关闭这个例子。但是在Java 7中,如果您对AutoCloseable资源使用try with resource,那么您真的不需要为此烦恼。

在你的代码中,最终的相关性除了学习最终如何工作之外什么都没有。

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

和来自同一链接的说明:

  

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

     

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

答案 1 :(得分:1)

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

* finally阻止只有当您在Thread / try区块中运行时中断或终止当前catch时才会执行。

这是一个更具体的docs

答案 2 :(得分:0)

来自Java Tutorials

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

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

答案 3 :(得分:0)

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

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

请注意,对象终结器在Java中存在(在时尚之后),但它们几乎不应该用于最终化对象......很奇怪,是吗?