最后一个块中的代码和最后一个块之后的代码之间的区别是什么?

时间:2014-05-28 19:06:41

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

我想知道finally块中的代码和finally块

之后的代码之间有什么区别

4 个答案:

答案 0 :(得分:6)

一个小的测试程序显示了差异:

public class FinallyTest {

    public static void main(String[] args) throws Exception {
        try {
            boolean flag = true;
            if (flag) {
                throw new Exception("hello");
            }
        } finally {
            System.out.println("this will get printed");
        }
        System.out.println("this won't show up");
    }
}

打印

this will get printed
Exception in thread "main" java.lang.Exception: hello
    at snippet.FinallyTest.main(FinallyTest.java:7)

一旦抛出异常,该线程将执行的唯一事情(直到异常被捕获)才是finally块(异常将离开最终所属的try-block)。

答案 1 :(得分:2)

如果catch块重新抛出异常(或抛出一个异常),则执行finally块。在finally块之后的任何内容都不会被执行。

  

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

答案 2 :(得分:2)

如果在catch块上抛出异常,或者在try块上返回一些内容,它将执行finally块。如果没有在finally块上(在try / catch / finally之后)它将无法工作。这是一个简单的例子供您理解:在没有finally块的情况下尝试它,您将看到它打印消息的行"关闭资源..."将永远不会被执行。

try {
    return "Something";
} catch (Exception e) {
    throw e;
} finally {
    System.out.println("Closing resources (Connections, etc.)...");//This will always execute
}

答案 3 :(得分:1)

在这里,我将在上面提供的示例中添加更多内容,可能会在将来对某人有所帮助,并希望避免某些混乱。

开始吧。

实际上,这取决于程序的流控制。这意味着如果程序的编写方式是:如果您的代码正在处理try块中引发的异常,并且如果您在catch块中对其进行处理,则finally块之后的代码将在finally块中的代码之后执行

示例1:,此处已处理了异常,因此最终执行了块之后的代码。

public class TestFinally {

    public static void main(String[] args) throws Exception {
        try {
            boolean flag = true;
            if (flag) {
                throw new Exception("hello");
            }
        } 
        catch(Exception e){
            System.out.println("catch will get printed");   
        }
        finally {
            System.out.println("this will get printed");
        }
        System.out.println("this won't show up");
    }
}

结果:

catch will get printed
this will get printed
this won't show up

示例2 :如果try块中的异常未按照上述Nathan的说明正确处理,则不会执行finally块之后的代码。

public class TestFinally {

    public static void main(String[] args) throws Exception {
        try {
            boolean flag = true;
            if (flag) {
                throw new Exception("hello");
            }
        } 
        // not handling the exception thrown above
        /*catch(Exception e){
            System.out.println("catch will get printed");   
        }*/
        finally {
            System.out.println("this will get printed");
        }
        System.out.println("this won't show up");
    }
}

结果:

this will get printed
Exception in thread "main" java.lang.Exception: hello
    at com.test.TestFinally.main(TestFinally.java:36)

因此,总而言之,总的来说, finally 块中的代码将始终执行,除非在某些情况下线程在 finally 块之前被停止或终止或如果在try块中编写了任何退出程序。而最终的代码取决于在try-catch-finally块中编写的代码和异常处理。