关于finally中赋值

Sunday September 2, 2007

今天看到一个有意思的程序,写下来

public class FinallyTest {
	private static int test() {
		int i=1;
		try {
			i=2;
			return i;
		} catch (Exception e) {
			i = 3;
			return i;
		} finally {
			i = 4;
		}
	}
	public static void main(String[] args){
		FinallyTest finallyTest = new FinallyTest ();
		System.out.println("i=" + finallyTest.test());
	}
}

运行结果是

i=2

为什么呢,不是明明在finally中赋值了i=4吗?
答案是:

i是值变量,在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理

finnaly,之后对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i

的值变了,但那是 i 的事情,不是Return的事情

如果在finnaly里面也加了return的话,这时候虚拟机栈又会把 i的值copy到return的栈顶(这时候是4)
所以在finnaly里面也加了return的话会返回4

这个题目正说明了java是按值返回的,如果把i设成Integer型,具有更好的说明性,i只是一个对象的引

用,在finnally中改变i只是将i指向另一个Integer对象,但是返回值在之前已经确定了

try 中return执行后,先退出try block,再退出 method body。
因为return已经执行,return的值是已经确定的,在接下来退出try block的时候执行了finally
的代码,此时finally对i值的修改已经不能影响return了,接下来程序退出method body,返回2

Leave a reply