黑马程序员技术交流社区

标题: 关于返回值问题,一直很纠结。 [打印本页]

作者: 王廷顺    时间: 2013-6-20 22:12
标题: 关于返回值问题,一直很纠结。
本帖最后由 王廷顺 于 2013-6-21 16:46 编辑

一道基础测试题:写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。一直没有比较清晰的思路,希望高手指点。
作者: peerless2012    时间: 2013-6-21 14:11
  1. public class Test {

  2.         /**
  3.          * 写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
  4.          *
  5.          * 思路:
  6.          *    1 targ初始化为0,在finally中给targ赋值,并在try语句中返回targ
  7.          *    2 如果得到的targ结果为0,则证明finally未改变返回值。
  8.          *    3如果finally中输出语句在main函数得到结果之前输出,证明return在finally执行之后才返回的
  9.          *
  10.          * 输出结果证明,
  11.          * finally的语句先执行,然后函数才会返回并且finally能改变targ的值,却改变不了返回的targ值
  12.          * 由此想到的,可能是程序运行到return语句时,检查到还有finally语句要执行,因此先把return需要返回的结果保存,
  13.          * 再让finally语句执行,finally执行结束后,直接把return语句直接把之前保存的结果输出,
  14.          * 这样finally是在返回之前改变了targ的值,但是无法改变return的返回值
  15.          *
  16.          *
  17.          *
  18.          */
  19.         public static void main(String[] args) {
  20.                
  21.                 //打印返回结果
  22.                 System.out.println("返回的结果是:" + returnTest());
  23.         }

  24.         public static int returnTest() {
  25.                 System.out.println("将一个变量赋值为0");
  26.                 int targ = 0;
  27.                 try {
  28.                         System.out.println("Try语句被执行.....");

  29.                         // 返回targ值(结果为0)
  30.                         return targ;
  31.                 } finally {
  32.                        
  33.                         // 打印,证明此函数被执行,并能从打印顺序证明代码执行顺序
  34.                         System.out.println("finally语句执行.....");

  35.                         // 尝试给targ赋值
  36.                         targ = 1;

  37.                         // 打印改变后的targ结果(结果为1)
  38.                         System.out.println("finally中的targ =" + targ);
  39.                 }
  40.         }

  41. }
复制代码

作者: ㄗs:/|丶hearts    时间: 2013-6-21 14:44
  1. public class Test7 {

  2.         /**
  3.          * 7、 写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub

  8.                 Test7 t =new Test7();
  9.                 //该句打印的str是 “finally之前的str”  finally没有改变返回值
  10.                 System.out.println(t.ReturnStr());
  11.         }

  12.         String str;

  13.         public String ReturnStr(){
  14.                 try{
  15.                         str="finally之前的str";
  16.                         System.out.println("没有执行finally前--"+str);
  17.                         return str;
  18.                        
  19.                 }finally{
  20.                         str="finally之后的str";
  21.                         //如果打印了这句,证明finally语句执行了  也就是return在finally执行后才返回的
  22.                         System.out.println("--执行了finally后--"+str);
  23.                 }                       
  24.         }
  25. }
复制代码

作者: 王廷顺    时间: 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