一般答案:会执行,在方法返回调用前执行。准确的说是在return中间执行。
下面举个例子:
public class Test {
public static void main(String[] args) {
System.out.println("结果: " + new Test().test());
}
static int test(){
int i = 1;
try {
System.out.println("try里面的i : " + i);
return i;
}finally{
System.out.println("进入finally...");
++i;
System.out.println("fianlly里面的i : " + i);
//return i;
}
}
}
结果是:try里面的i : 1
进入finally...
fianlly里面的i : 2
结果: 1
结果是1,并不是大家想象的结2。相关解释如下:
上面我认为比较靠谱的一种解释。
还有一种解释为:
主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
楼主是从现象级别分析的,我觉得百度知道那个答案说的不够彻底和核心。
从C#(我是C#) 局部变量和函数返回值的存储方式来理解,
从C#(我是C#) 局部变量和函数返回值的存储方式来理解,
他们都存储在堆栈(一种先进后出的结构)上,在上述函数返回的时候,会将返回值压入堆栈栈顶,相当于堆栈中现在有两个相同的值,而finally 使用的是之前的局部变量的值,所以finally操作不会对 返回值产生影响。
说到这里,如果原局部变量是一个引用类型,在try 中叶返回引用,那么堆栈中会有两个引用,但是实际指向同一个对象,这时候在finally正对该局部变量操作会对原对象产生影响。
如果我在finally里最后加上一句return i;那么最后的结果是2,因为上面说用栈保存的值,那这个结果我可不可以理解为:因为栈是先进后出的结构嘛,所以当2压入栈中的时候是在栈顶,所以输出的是栈顶的值也就是2.
最终总结:return语句会先压入栈里面,最后执行finally语句(有return语句,值压入栈中),最后弹出栈顶元素。
转自:http://blog.sina.com.cn/s/blog_4cef5c7b0102wf9m.html