关于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
