黑马程序员技术交流社区
标题:
关于返回值问题,一直很纠结。
[打印本页]
作者:
王廷顺
时间:
2013-6-20 22:12
标题:
关于返回值问题,一直很纠结。
本帖最后由 王廷顺 于 2013-6-21 16:46 编辑
一道基础测试题:写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。一直没有比较清晰的思路,希望高手指点。
作者:
peerless2012
时间:
2013-6-21 14:11
public class Test {
/**
* 写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
*
* 思路:
* 1 targ初始化为0,在finally中给targ赋值,并在try语句中返回targ
* 2 如果得到的targ结果为0,则证明finally未改变返回值。
* 3如果finally中输出语句在main函数得到结果之前输出,证明return在finally执行之后才返回的
*
* 输出结果证明,
* finally的语句先执行,然后函数才会返回并且finally能改变targ的值,却改变不了返回的targ值
* 由此想到的,可能是程序运行到return语句时,检查到还有finally语句要执行,因此先把return需要返回的结果保存,
* 再让finally语句执行,finally执行结束后,直接把return语句直接把之前保存的结果输出,
* 这样finally是在返回之前改变了targ的值,但是无法改变return的返回值
*
*
*
*/
public static void main(String[] args) {
//打印返回结果
System.out.println("返回的结果是:" + returnTest());
}
public static int returnTest() {
System.out.println("将一个变量赋值为0");
int targ = 0;
try {
System.out.println("Try语句被执行.....");
// 返回targ值(结果为0)
return targ;
} finally {
// 打印,证明此函数被执行,并能从打印顺序证明代码执行顺序
System.out.println("finally语句执行.....");
// 尝试给targ赋值
targ = 1;
// 打印改变后的targ结果(结果为1)
System.out.println("finally中的targ =" + targ);
}
}
}
复制代码
作者:
ㄗs:/|丶hearts
时间:
2013-6-21 14:44
public class Test7 {
/**
* 7、 写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test7 t =new Test7();
//该句打印的str是 “finally之前的str” finally没有改变返回值
System.out.println(t.ReturnStr());
}
String str;
public String ReturnStr(){
try{
str="finally之前的str";
System.out.println("没有执行finally前--"+str);
return str;
}finally{
str="finally之后的str";
//如果打印了这句,证明finally语句执行了 也就是return在finally执行后才返回的
System.out.println("--执行了finally后--"+str);
}
}
}
复制代码
作者:
王廷顺
时间:
2013-6-21 16:46
peerless2012 发表于 2013-6-21 14:11
简单明了,我懂了,非常感谢!
作者:
peerless2012
时间:
2013-6-22 08:23
王廷顺 发表于 2013-6-21 16:46
简单明了,我懂了,非常感谢!
这也是我的基础测试题,直接拿过来了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2