A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王廷顺 中级黑马   /  2013-6-20 22:12  /  1720 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王廷顺 于 2013-6-21 16:46 编辑

一道基础测试题:写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。一直没有比较清晰的思路,希望高手指点。

评分

参与人数 1技术分 +1 收起 理由
Just_Only + 1 加油!!!

查看全部评分

5 个回复

倒序浏览
  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. }
复制代码

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
卢祥洲 + 1 很给力!
Just_Only + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张勇1993 + 1 赞一个!

查看全部评分

回复 使用道具 举报

简单明了,我懂了,非常感谢!
回复 使用道具 举报
王廷顺 发表于 2013-6-21 16:46
简单明了,我懂了,非常感谢!

这也是我的基础测试题,直接拿过来了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马