思考:
在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。