在JAVA语言的异常处理中,finally里面代码块是为了保证无论出现了什么样的情况,finally里的代码一定会被执行。但是return 的意思就是结束当前函数的调用并跳出这个函数,因此finally块里面的代码也是在return前执行,如果try finally里都有return,那么 finally中的return将覆盖其他地方的return.代码如下:
class FinallyTest
{
public int method1()
{
try {
return 2;
}
catch(Exception e) {return 3;}
}
public int method2()
{
try {
return 3; //1
}
finally { //2
return 4;
}
}
public static void main(String args[])
{
FinallyTest ft = new FinallyTest();
System.out.println("method1 returns " + ft.method1()); //3
System.out.println("method2 returns " + ft.method2()); //4
}
}
{
public int method1()
{
try {
return 2;
}
catch(Exception e) {return 3;}
}
public int method2()
{
try {
return 3; //1
}
finally { //2
return 4;
}
}
public static void main(String args[])
{
FinallyTest ft = new FinallyTest();
System.out.println("method1 returns " + ft.method1()); //3
System.out.println("method2 returns " + ft.method2()); //4
}
}
运行结果是:method1 returns 2
method2 returns 4
method2 returns 4
下面步入正题:如果try里面有return,是先执行return 还是先执行finally,
这个问题我问过很多人,也得到了很多答案
以下是讨论过程:
肖:
其实应该还是之前的,虽说是保存了返回的代码,但也是保存,还没返回,执行完finally才把之前保存的掉出来,总觉得中间怪怪的,
陈:
网上的说法,不是先执行,是先保存起来,然后执行finally,然后再执行return
在java的语言规范有讲到,如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。
郭:
刚刚那道题finally里的return也会执行,只不过改变不了返回值,还是返回try里面的return的值
《practical java》讲过这个问题,有兴趣可以看看
下面贴我自己的部分代码:
public class ReturnTest {
public static void main(String args[]){
int a = test();
System.out.print(a);
}
static int test() {
int x = 1;
try {
return ++x ;
} finally {
if (x > 1) {
x += 10;
}
}
}
}
运行结果:x=:2
由此可见,在运行finally之前,x就已经等于2,但是控制台里finally里面的x=:先执行,再执行的return 2,且x+=10这句话根本没对return的值造成影响,再综合以上朋友说的,我觉得可以总结为:
运行时,在try中,要返回的结果已经准备好了,就在这个时候,程序跳到了finally,这个时候结果已经放到了x的局部表量中,执行完finally后,再取出结果,finally对x进行了改变,但不会影响返回的结果。