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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘建华 中级黑马   /  2015-1-12 11:19  /  1100 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
/**
6、 用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行finally?
@author 刘建华
*/
/*
*在try中写了return,后面又写了finally,是先执行return还是先执行finally?
*思路:1.定义一个返回值为int的函数。在try代码块中和fianlly代码块中分别对num进行赋值;
*然后再try代码块中return中返回这个num。然后再主函数中打印出num的值。然后在finally中
*加入return返回num,再打印出num的值。查看num的值,进行判断。
*步骤:1.建立两个类。
*1.分别在其中建立一个返回值为int类型的函数。
*2.分别在其中建立try代码块和finally代码块,分别在其中给num不同的值。
*4.在第一个类中的try代码块中加入return语句返回num的值。
*5.在第二个类中的try代码块和finally代码块中都加入return语句返回num的值
*3.在主函数中调用这个函数。打印出num的值。
*/
class Test_1
{
        //建立一个返回值为int的函数。
        public static int Num()
        {
                int num;
                //运行try代码块时,给num赋值。
        try
        {
                 //用来检测try块里面处于return前的语句是否有被执行  
        System.out.println("此时try语句块正在被执行");
        num=8;
                return num;
        }
        //运行finally代码块时,给num赋值。
        finally
        {
                //用来检测finally语句块中的语句有没有被执行  
        System.out.println("此时finally语句块正在被执行");
                num=11;
        }
        }
}
class Test_2
{
        //建立一个返回值为int的函数。
        public static int Num()
        {
                int num;
                //运行try代码块时,给num赋值。
        try
        {
                 //用来检测try块里面处于return前的语句是否有被执行  
        System.out.println("此时try语句块正在被执行");
        num=8;
        return num;
        }
        //运行finally代码块时,给num赋值。
        finally
        {
                //用来检测finally语句块中的语句有没有被执行  
        System.out.println("此时finally语句块正在被执行");
                num=11;
                return 7;
        }
        }
}
public class Test6
{
        //打印出num的值
        public static void main(String[] args)
        {
                System.out.println(Test_1.Num());
                System.out.println(Test_2.Num());
        }
}
/*判断:1。如果两次打印出了的值为finally代码块中给num赋的值,证明了先执行finally,后执行return。
2。如果两次打印出的值为try代码块中给num赋的值,证明行执行return,后执行finally
3.如果第一次打印值为try代码块给num赋的值,第二次为finally代码块给num赋的值。则证明是先执行finally,后执行
return,而且finally代码块不能改变try中的返回值。
结果证明:第一次打印值为try代码块给num赋的值,第二次为finally代码块给num赋的值。所以是先执行finally,后执行return。
其顺序是:先执行try,在执行finally,最后执行try中的return*/


评分

参与人数 1技术分 +2 收起 理由
lwj123 + 2

查看全部评分

4 个回复

倒序浏览
很好,我又长知识了。
回复 使用道具 举报
看着  有点晕
回复 使用道具 举报
附加一句,如果finally中有return语句的话,是不会再执行try块中return语句的
回复 使用道具 举报
我觉得得出这个结论不太准确。应该是先处理了try中return的结果,但不立刻返回,而是将结果缓存,然后执行finally。若finally中有return, 则直接返回finally中return的结果,若finally中没有return, 则将try中return的结果返回给调用函数。

这段代码可以证明try中的return是先于finally处理的。
  1. public class TestRF {
  2.         // 定义一个静态变量x作为判断条件
  3.         static int x = 1;

  4.         public static void main(String[] args) {
  5.                 // 调用测试函数
  6.                 test();
  7.                 // 输出x的值作为测试结果
  8.                 System.out.println("x=" + x);
  9.                 // 若先处理return,则x的值为(1+2)*3=9
  10.                 // 若先处理finally,则x的值为1*3+2=5
  11.                 // 输出结果为9
  12.         }

  13.         public static int test() {
  14.                 try {
  15.                         // 使x的值加2
  16.                         return x = x + 2;
  17.                 } finally {
  18.                         // 使x的值乘3
  19.                         x = x * 3;
  20.                 }
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +3 收起 理由
lwj123 + 3 很给力!

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马