锁定老帖子 主题:在finally赋值为什么无效?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-12
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了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-12
你在finally里面没加return i;
这样就可以返回4了 |
|
返回顶楼 | |
发表时间:2007-05-12
是在finally里执行了i=4,可是函数并没有返回它,所以打印出来的仍是2
|
|
返回顶楼 | |
发表时间:2007-05-12
i=2后面没有分号是笔误吧,
比较奇怪的问题, finally里面的语句是在return之前执行, i=4肯定执行了, 但为什么返回值还是2,不太清楚,手头没有环境没法测试。 debug跟进去看看i 值的变化过程就清楚了。 |
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间:2007-05-12
如在finally里加return,返回4。
debug过了,i=4肯定执行了,且是在i=2之后执行,可偏偏就是返回傎是2,不知道为什么,难道是jdk的bug? Godlikeme 写道 i=2后面没有分号是笔误吧,
比较奇怪的问题, finally里面的语句是在return之前执行, i=4肯定执行了, 但为什么返回值还是2,不太清楚,手头没有环境没法测试。 debug跟进去看看i 值的变化过程就清楚了。 |
|
返回顶楼 | |
发表时间:2007-05-12
是有点弱智,不过请Michael.Scofield解释一下为什么会返回2?原理过程...
Michael.Scofield 写道 这个问题太弱智了吧,呵呵
|
|
返回顶楼 | |
发表时间:2007-05-12
i是值变量,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。
这个问题我觉得挺好,LZ有研究问题,问为什么的态度,我评良好! |
|
返回顶楼 | |
发表时间:2007-05-12
受用非淺!
Qieqie 写道 i是值变量,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。
这个问题我觉得挺好,LZ有研究问题,问为什么的态度,我评良好! |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |