发新话题
打印

关于finally中赋值

关于finally中赋值

今天看到一个有意思的程序,写下来
publicclassFinallyTest{
   
privatestaticinttest(){
        
inti=1;
        
try{
            
i=2;
            
returni;
        
}catch(Exceptione){
            
i = 3;
            
returni;
        
}finally{
            
i = 4;
        
}
   
}
   
publicstaticvoidmain(String[]args){
        
FinallyTestfinallyTest = newFinallyTest();
        
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
呵呵,很有意思的程序
看前面想了半天想不明白,往下看,汗了一下,有答案的!!!
电脑就是好啊!
呵呵,说的不错,就是代码布局丑陋了点
发新话题