黑马程序员技术交流社区

标题: 异常处理执行顺序 [打印本页]

作者: 吴通    时间: 2012-9-10 00:04
标题: 异常处理执行顺序
本帖最后由 吴通 于 2012-9-11 21:56 编辑

在论坛看到一段代码
class Test1
{
public static void foo(int i)
{
  String output="";
    try
    {
     if(i==1)
   throw new Exception();
     output+="1";
    }
    catch(Exception e)
    {
     output+="2";  
     return;
    }
    finally
    {
     output+="3";
    }
    output+="4";
   System.out.println(output);
}
public static void main(String args[])
{
    foo(1);
}
}
执行foo(1)的时候i=1,所以程序跳转,执行catch,再执行finally语句
但是最后为什么红色字体没有执行?

作者: Tesla时光    时间: 2012-9-10 00:16
哥们,我刚从这题的一个坑里爬起来,你又掉进去了另一个坑,呵呵
ok,说正题
class Test1
{
public static void foo(int i)
{
  String output="";
    try
    {
     if(i==1) //foo(1),这个条件满足,执行try
   throw new Exception();
     output+="1";
    }
    catch(Exception e)//try完后catch
    {
     output+="2";  这句执行了,
     return; //这句呢?你忘了吗?这句也会执行,这个退出程序用的.
    }
    finally
    {
     output+="3";//但是,这是finally,所以这句是会执行的,只要没遇到System.exit();
    }
    output+="4";//程序都退出了,这两句怎么执行?
   System.out.println(output);
}
public static void main(String args[])
{
    foo(1);
}
}
所以结果是23,而非234.
作者: 王小涛    时间: 2012-9-10 00:17
出异常后,执行catch中的处理异常代码,如果没有finally语句程序就直接终止结束了,如果有finally语句,就接着执行finally语句里的代码,然后程序就终止了。
所以finally语句后面的红色代码在出异常的情况下,都没有被执行
作者: 李菁    时间: 2012-9-10 00:44
return和finally同时出现,先执行return,后执行finally。
你catch块里的return结束了整个程序,所以红色字体没有执行到。
作者: 张飞年    时间: 2012-9-10 00:54
本帖最后由 张飞年 于 2012-9-10 00:57 编辑

楼主这个问题比较有意思,先来说说执行过程吧,这样更清楚些:(用数字表明执行步骤)
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语句“。
作者: 杨习平    时间: 2012-9-10 01:41
本帖最后由 杨习平 于 2012-9-10 01:49 编辑

class Test1
{
public static void foo(int i)
        {
          String output="";
            try
            {
             if(i==1)
                    
           throw new Exception();
             //这条语句由于抛异常直接进入到catch,所以就没打印执行
             System.out.println(output+="1" );
            
          }
            catch(Exception e)
            {
            //抛异常完后接着语句执行打印出
                    System.out.println( output+="2");
             return; //接着这里遇到了return语句,他不会执行,是因为jvm发现患有finally语句,这里
                     //他就记忆性的跳过去追踪finally语句。
         
           }            
            finally
            {
                    //我们都知道的,finally语句除了系统推出语句之外都会执行的,然后就返回执行return,推出程序。
                    System.out.println(output+="3");
         
           }
            output+="4";
           System.out.println(output);//这里由于没有执行的权限和条件,jvm根本不会去执行。

        }
        public static void main(String args[])
        {
            foo(1);
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2