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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 人在旅途~东营 中级黑马   /  2015-5-24 01:49  /  647 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目一:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,
* 什么时候被执行,在return前还是后?使用程序验证。
*
*                 答:会,在return语句执行的中间运行的finally语句
*                         在try语句中,在执行return语句的时候,要返回的结果其实已经准备好了,
*                         这时候try中返回的结果先储存到一个局部变量中,执行完finally后,从中取出返回结果.
*                 1:  return i; //20  这个时候 只是进行了返回的标记,同时,确定要返回的数据值,没有真正的执行返回语句
*                 2:  执行了 finally语句
*                 3:      再回到return i; 返回当时的i值,也就是20
* 程序运行结果:
*                         产生了异常
*                         执行finally语句
*                         结果是:20
*                         程序结束了
* */
public class Try_Test {
        public static void main(String[] args) {
                System.out.println("结果是:"+new Try_Test().method(20));
               
                //System.out.println(result);
                System.out.println("程序结束了");
        }

        private static int method(int i) {//i = 20
                // TODO Auto-generated method stub
                try {
                        System.out.println(i/0);
                       
                } catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("产生了异常");
                        return i;//20
                }
                finally {
                        System.out.println("执行finally语句");
                        i++;//21
                }
                return 0;
       
        }


       
}

8 个回复

倒序浏览
竟然没有人看,是我太水了么~
回复 使用道具 举报
我来了,哈哈,这样做就可以了:
  1. package com.ceshi;

  2. /**
  3. * 第一题:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?使用程序验证。
  4. *
  5. * try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会 被执行到,在return后被执行到,验证程序如下:
  6. * @author Administrator
  7. *
  8. */
  9. public class TryFinally {

  10.         public static void main(String[] args) {
  11.                 System.out.println(show());
  12.         }
  13.        
  14.         /*
  15.          * 定义show()函数,用i来标记返回的值,如果finally语句块先于return执行,那么主函数当中最后打印输出的值应该是1;否则,主函数当中打印输出的值应该是0
  16.          */
  17.         public static int show()
  18.         {
  19.                 int i = 0;//用i来进行标识
  20.                 try{
  21.                         System.out.println("try running+++"+i);
  22.                         return i;
  23.                 }
  24.                 finally{
  25.                         i++;
  26.                         System.out.println("finally running+++"+i);
  27.                 }
  28.         }

  29. }
复制代码
上面已解释清楚,不再废话了。
回复 使用道具 举报
  1. //分析:在方法中定义整型变量num赋值为1;根据Java虚拟机的缓存机制来解决之个问题
  2. //      如果先执行return:那么结果是这样的:[(1+1+1)+ 1] +{[(1+1+1)+ 1]+1} = 9
  3. //      如果先执行finally:那么结果是这样的: {(1+1)+ [(1+1)+1]} + {(1+1)+ [(1+1)+1]+1} =11  
  4. //      如果输出的结果为3,则是先执行return

  5. /**
  6. * 由于以下代码执行的结果是9,所以先执行的是return
  7. */
  8. class Test {
  9.         public int method() {
  10.                 // 声明整型数据num
  11.                 int num = 1;
  12.                 try {
  13.                         num = num++ + num++;
  14.                         return num;
  15.                 } finally {
  16.                         num = ++num + ++num;
  17.                         System.out.println("num=" + num);
  18.                 }
  19.         }
  20. }
  21. public class Test8 {
  22.         public static void main(String[] args) {
  23.                 // 声明Test对象,调用方法
  24.                 Test test = new Test();
  25.                 test.method();
  26.         }
  27. }
复制代码

我是这么实现的
回复 使用道具 举报
学习了!
回复 使用道具 举报
赞一个~~
回复 使用道具 举报
赞一个~~~
回复 使用道具 举报
wangaz 发表于 2015-5-25 17:53
我来了,哈哈,这样做就可以了:上面已解释清楚,不再废话了。

我的程序没问题吧?只是发帖格式的问题的话那我就放心了
回复 使用道具 举报
人在旅途~东营 发表于 2015-5-25 16:25
竟然没有人看,是我太水了么~

会执行,
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 /**
  4.                  * 会执行,在return前执行;
  5.                  * 分析:finally是不管遇到任何事都必须执行的语句块,如果在try中直接return了,
  6.                  * 那么finally就执行不了,
  7.                  * 就违背了这条规则,所以是先执行finally中的code再return
  8.                  */
  9.                 testOne();
  10.         }

  11.         public static String testOne() {
  12.                 try {
  13.                         System.out.println("执行到try语句块中!");
  14.                         return "";
  15.                 } catch (Exception e) {
  16.                         // TODO: handle exception
  17.                 } finally {
  18.                         System.out.println("finally中的code执行了!");
  19.                 }
  20.                 return "";
  21.         }
  22. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马