在try中写了return,后面又写了finally,是先执行return还是先执行fianlly

  • Post author:
  • Post category:其他




思考:

在java的学习中,关于异常的处理是很重要的一环,笔者最近在学习这一方面的知识时就遇到了一个问题:就是在try语句块中写了return,但后面又写了finally语句,那么程序到底是先执行return语句呢还是先执行finally语句。

磨刀不误砍柴工,先来回顾一下有关try-catch语句块的只是要点。在异常处理的语法中往往伴随着try-catch语句块的出现,但是就异常处理的语法结构上来说只有try块是必须的,也就是说,如果没有try块,则不能有后面的catch块和finally块,catch块和finally块是可选的,但是catch块和finally块要至少出现一个。当然也可以同时出现,可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面。但是不能同时没有两者,多个catch块必须位于try块之后,finally块必须位于所有的catch块之后,因为finally通常用于资源的回收,异常处理中的finally块总会被执行。

说了这么多,还是回到前面的问题上来,接下来就是代码的证明:



代码:

public class Test {
    public static void main(String[] args) {
        System.out.println(test());
    }

    /**
     * 自定义一个test测试函数
     */
    public static boolean test(){
        try {
            //用来检测try块里面处于return前的语句是否有被执行
            System.out.println("此时在try中执行...");
            return false;
        } finally {
            用来检测finally语句块中的语句有没有被执行
            System.out.println("此时finally语句块正在被执行...");
            return true;
        }
    }
}

程序最后运行的结果是:

此时在try中执行...
此时finally语句块正在被执行...
true

通过程序的运行结果可以看出,try中的return语句并没有被执行。

如果我注释掉finally语句块中return语句,程序的运行结果又会是什么样的呢?

此时在try中执行...
此时finally语句块正在被执行...
false



总结:

通过这两个运行结果的不同,我们不难得出结论

当java程序在执行try块、catch块时如果遇到了return或者throw时,这两个语句都会导致该方法立即结束,但是系统在执行这两个语句时并不会结束该方法,而是去寻找该异常处理流中是否包含了finally语句块,如果没有finally块,则程序会立即执行return或者throw语句,方法终止。如果有finally语句块,系统会开始立即执行finally语句块,只有当finally语句块中的代码被执行完了之后,系统才会回来再次执行try块或者catch块中的return或throw语句,但是如果finally块中也有return或者throw这样能是方法结束的语句,则finally块就会立即结束该方法,系统将不会跳回去执行try块或者catch中的任何语句。

所以在注释掉finally块中的return语句后,程序再次跳到了try中的return语句,最后结果返回了false。