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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wsc1988126 初级黑马   /  2012-10-23 19:55  /  2468 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

9 个回复

倒序浏览
        也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:
public  class Test {

        /**
         * @param args add by zxx ,Dec 9, 2008
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(new Test().test());;
        }

        static int test()
        {
                int x = 1;
                try
                {
                        return x;
                }
                finally
                {
                        ++x;
                }
        }
       
        }
       
        ---------执行结果 ---------
        1
       
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
于连林 发表于 2012-10-23 19:56
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:  ...

这段程序执行后的结果确定是1??
回复 使用道具 举报
看程序执行的时候return执行之前的话,有异常产生,肯定会执行finnaly 了,return就不会执行
如果程序执行的时候执行了return  方法都执行结束了。就不会执行finnaly

点评

错了,finally一定执行,而且是在return之前执行,并且finally里对变量值的改变不会影响返回值。  发表于 2012-10-23 21:57
回复 使用道具 举报
本帖最后由 秦松 于 2012-10-23 22:22 编辑

搞错了....
回复 使用道具 举报
秦松 发表于 2012-10-23 20:28
如果存在异常,执行finally,return不执行,程序结束

反之如果执行return,不执行finally,结束程序 ...

class ReturnTest
{
        public static void main(String[] args)
        {
                System.out.println(method());
        }
        public static int method()
        {
                int x = 1;
                try
                {
                        return x;
                }
                finally
                {
                        System.out.println(++x);               
                }
        }
}

你可以试试这段代码的结果
回复 使用道具 举报
try{}里有return语句 还是会执行finally{}里面的代码的,当执行完finally中的语句后才执行try中的return 语句
  1. public class Test{
  2.         public static void main(String args[]){
  3.                 System.out.println(test());
  4.                 }
  5.         public static int test(){
  6.                 int a=9;
  7.                 try{
  8.                         System.out.println("The first");
  9.                         return a;
  10.                 }
  11.                 finally{
  12.                        
  13.                         System.out.println("The second");
  14.                        
  15.                         a=23;  
  16.                         System.out.println("The finally");
  17.                         }
  18.         }
  19.        
  20. }
复制代码
运行结果是:
The first
The second
The finally
9

回复 使用道具 举报
会执行 会在return 之前执行  因为finally是必须执行的语句块  而return是返回调用方法处 根据此逻辑应该是在return之前执行的
回复 使用道具 举报
有一个自己写过的例子来说明:
举个例子,看代码,先来说说执行过程吧,这样更清楚些:(用数字表明执行步骤)
class Test1
{
public static void foo(int i)
{
  String output="";
      try
      {
     if(i==1) //2、其他细节省略这是第二步,这里条件为真执行if中的code
     throw new Exception();  //3、这里正常执行抛出异常,有异常则处理异常,这里有catch,则进入catch里面
      output+="1"; //这句没有执行
     }
    catch(Exception e)
      {
     output+="2";   //3、细节省略,到这里后执行加2,结果为“2”
       return;  //4、关键是这句,根据张孝祥老师说的,finally中的code会在return语句执行时的中间执行,(后面我会注明位置可以自己去看)我测试看到的现象是finally是在return前执行,所以在这里return时会迅速去执行finally中的内容,然后程序Over
     }
    finally
      {
     output+="3"; //5、在return之前会执行此处语句,现在结果为:“23“,也是最终结果
      }
    output+="4";  //这里没被执行到
    System.out.println(output); //这里没有被执行到
}
public static void main(String args[])
{
    foo(1); //1、其他不多说这是第一步,这里传1进去
}
}
注:关于try--catch-finally过程不再细说,论坛可查到,这里关键是try中加入return的情况的处理,具体可以看一下张孝祥老师的《面试宝典》的第43条,编号可能有点难找,可以直接搜索关键词”try {}里有一个return语句“。
回复 使用道具 举报
不管有没有异常,finally都会执行,并且是先执行finally,后执行return,不过finally不能改变return的返回值,
  1. public class Text {
  2.        
  3.         public static int text(){
  4.                
  5.                 int i;
  6.                 //在try块内赋值i=1,并执行return语句返回i的值
  7.                 try{
  8.                         i=1;
  9.                         return i;
  10.                 }
  11.                 //在finally块内输出提示语,并修改i的值
  12.                 finally{
  13.                         System.out.println("执行finally函数。");
  14.                         i=2;
  15.                 }
  16.         }

  17.         public static void main(String args[]){
  18.                 //在主函数中调用text函数
  19.                 System.out.println(text());
  20.         }
  21. }
复制代码
运行结果:
执行finally函数。
1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马