论坛首页 入门技术论坛

在finally赋值为什么无效?

浏览 7333 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-12  
OO
下面的代码:
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,而不是等于4,明明在finally里赋值为4了
   发表时间:2007-05-12  
你在finally里面没加return i;

这样就可以返回4了
0 请登录后投票
   发表时间:2007-05-12  
是在finally里执行了i=4,可是函数并没有返回它,所以打印出来的仍是2
0 请登录后投票
   发表时间:2007-05-12  
i=2后面没有分号是笔误吧,
比较奇怪的问题,
finally里面的语句是在return之前执行,
i=4肯定执行了,
但为什么返回值还是2,不太清楚,手头没有环境没法测试。
debug跟进去看看i 值的变化过程就清楚了。
0 请登录后投票
   发表时间:2007-05-12  
在try.catch外面return i;
private static int test() {
		int i = 1;
		try {
			i = 2;
		} catch (Exception e) {
			i = 3;
		} finally {
			i = 4;
		}
		return i;
	}
0 请登录后投票
   发表时间:2007-05-12  
如在finally里加return,返回4。

debug过了,i=4肯定执行了,且是在i=2之后执行,可偏偏就是返回傎是2,不知道为什么,难道是jdk的bug?

Godlikeme 写道
i=2后面没有分号是笔误吧,
比较奇怪的问题,
finally里面的语句是在return之前执行,
i=4肯定执行了,
但为什么返回值还是2,不太清楚,手头没有环境没法测试。
debug跟进去看看i 值的变化过程就清楚了。
0 请登录后投票
   发表时间:2007-05-12  
是有点弱智,不过请Michael.Scofield解释一下为什么会返回2?原理过程...
Michael.Scofield 写道
这个问题太弱智了吧,呵呵
0 请登录后投票
   发表时间:2007-05-12  
i是值变量,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。


这个问题我觉得挺好,LZ有研究问题,问为什么的态度,我评良好!


0 请登录后投票
   发表时间:2007-05-12  
受用非淺!
Qieqie 写道
i是值变量,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。


这个问题我觉得挺好,LZ有研究问题,问为什么的态度,我评良好!


0 请登录后投票
   发表时间:2007-05-12  
Qieqie 写道
i是值变量,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。

这个问题我觉得挺好,LZ有研究问题,问为什么的态度,我评良好!



这个有说服力。

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

所以在finnaly里面也加了return的话会返回4。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics