黑马程序员技术交流社区
标题:
异常处理执行顺序
[打印本页]
作者:
吴通
时间:
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