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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马杨晨 于 2012-8-28 14:59 编辑

try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

评分

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

查看全部评分

8 个回复

倒序浏览
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后
会执行,再return后面。只有执行这个System.exit(0);系统退出语句,fanally才不会执行。

评分

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

查看全部评分

回复 使用道具 举报
楼主的这个问题 毕老师的视频里有详细的解释
并且毕老师专门举例说明
在第10天的第一个视频里有专门的介绍

如果在try块中有return语句是
程序执行到return语句 会先判断finally块里是否有要执行的代码
如果有 就先执行finally块中的语句 然后再结束方法

评分

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

查看全部评分

回复 使用道具 举报
首先,看个例子:
  1. public class JVMTest {
  2.         public static void main(String[] args) {
  3.                 System.out.println("aa:" + aa());
  4.         }

  5.         public static int aa() {
  6.                 int a = 1;
  7.                 int b = 10;
  8.                 try {
  9.                         System.out.println("abc");
  10.                         return a;
  11.                 } finally {
  12.                         a = 2;
  13.                         System.out.println("a: " + a);
  14.                 }
  15.         }
  16. }
复制代码
此程序的运行结果为:
abc
a: 2
aa:1


由此可知:在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。 在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果, 因此,即使finally中对变量a进行了改变,但是不会影响返回结果。 但是,如果在finally子句中最后添加上return a会怎样呢? 执行结果如下:
abc
a: 2
aa:2

可以看出aa的值变成了2。率先结束了当前程序的运行,使得try语句中的return语句没被执行。

由此例可以得出结论:
1、不管出没出现异常,finally块中的语句都会执行。
2、当try或catch块中有return语句时,finally块中的语句仍会执行。
3、finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的。
4、Finally里面可以有返回语句,也可以执行,但是eclipse中会有警告。因为这样的话,finally中的return会覆盖掉正常和非正常return的信息,导致用户无法判断当前的情况。

评分

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

查看全部评分

回复 使用道具 举报
RWJ2012 发表于 2012-8-27 18:09
首先,看个例子:此程序的运行结果为:
abc
a: 2

try {

                        System.out.println("abc");

                        return a;

                } finally {

                        a = 2;

                        System.out.println("a: " + a);

                }

abc
a: 2
aa:1

根据运算结果可以判断出语句的执行顺序
1.System.out.println("abc");
2.a = 2;
3.System.out.println("a: " + a);
4.return a;System.out.println("aa:" + aa());

因此 finally块中的代码确实是在return语句之前执行的
但是 运行结果可以证明 finally块中的代码不会对rerun语句的返回结果有影响
回复 使用道具 举报
你在finally语句块中加一句return a;再试下,就会影响到try语句块中的返回结果。
回复 使用道具 举报
本帖最后由 焦晨光 于 2012-8-27 18:41 编辑

我们分析的是在try块中有return语句时和finally语句块中语句的执行顺序
具体情况要具体分析
如果 try块和finally中都有return语句
哪个return会先执行?
很明显是finally中的
因此 finally块中的代码(return) 仍然是先于try块中的return语句执行

回复 使用道具 举报
finally中存放的是一定会被执行的代码,常用于关闭资源。
try
{
     语句1;
     return ;
}
finally
{
    语句2;
}
这种情况finally中的语句会被执行。
不管return在finally前还是finally后,finally中的语句都会被执行。
try
{
    语句3;
    system.exit(0);
}
finally
{
    语句4;
}
这种情况finally中的语句不会被执行。
finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行, 系统退出,jvm结束。
回复 使用道具 举报
//return是在finally执行后才返回的,且在finally无法改变返回值。
*/
class FinallyTest
{
        public static int demo()
        {
        int a = 1;
        try
        {
                System.out.println("try的 a:"+a);
                return a;//需要被检测的代码块
        }
        finally //一定会执行的语句
        {
                a=5;
                System.out.println("finally的 a:"+a);
                //return 15;
        }
}


public static void main(String[] args)
        {
                System.out.println("demo:"+demo());//调用demo,如果打印结果为1证明 finally不能改变try里面的返回值
        }
}




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