1
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 块的基本功能是什么。

4

4 回答 4

5

finally 块用于运行代码,无论是否存在异常。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 语句,它会在不再需要时自动释放系统资源。

于 2013-08-17T01:39:45.813 回答
1

无论发生什么trycatch阻塞,finally原因都会为您确保*将被执行。

*只有在/块中运行时finally中断或杀死当前块,才会执行该块。Threadtrycatch

这是一个更具体的文档

于 2013-08-17T01:48:18.007 回答
0

来自Java 教程

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

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

于 2013-08-17T02:19:54.470 回答
0

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

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

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

于 2013-08-17T04:15:46.280 回答