分享

含有return 的try catch finally的执行顺序!

 JUST SO LAZY 2011-11-10
含有return 的try catch finally的执行顺序!
2010-07-19 10:32
static int f() {//这里报编译错误:must return a resutl of type int!
int id = 0;
try {
return id;
} catch (Exception e) {

} finally {

}
}

static int f2() {//但是这里怎么不报 错误呢?
int id = 0;
try {
return id;
} finally {
}
}
-------- try catch finally顺序:
1.try {}.
2.如果有Error Exception则,执行catch(){}中的代码。
3.无论有没有 Error Exception都要执行finally{}中的代码。
4.执行 try 中的 return
----------------------------------------------我的问题是----------------
1. 函数f中为什么报错误?在try中有return 啊!怎么说 must return a resutl of type int?? 当去掉catch之后,却没有报错误了,为什么呢???

2.谁能详细的说一说 try中有return的时候的 try catch finally return 的执行顺序??
回答 1



------其他回答(5分)---------

引用 3 楼 mochibing 的回复:
很简单,f因为有catch,所以编译器就会认为try里面的return是无效的;f2没有catch,try里面也没有会抛出非运行时异常(IOException,NumberFormatException。。。)的代码,所以编译器认为try里面的return是有效的,所以不管finally有没有return,f2都可以编译通过

修改一下

很简单,f因为有catch,所以编译器就会认为try里面的return有可能是无效的;f2没有catch,try里面也没有会抛出非运行时异常(IOException,NumberFormatException。。。)的代码,所以编译器认为try里面的return是必定会被执行的,所以不管finally有没有return,f2都可以编译通过
------其他回答(5分)---------

引用 1 楼 greenvesture 的回复:
1.有catch就说明程序可能会中断,也就是不一定会执行return....就好比你在一个if语句中写return一样..你必须保证让程序最后总是能返回一个值..
2.就是你说的这个顺序

return id;,这句代码看是一行代码,先执行id再执行return。执行id的时候引发了异常,就跳转到catch。
在return还没有执行完,引发了异常,中断了return,进入了catch里。执行catch里的处理,这时候return并没有返回,而被中断了.所以你最终还是没有返回int.你可以在if块最后加上return 0;
------其他回答(5分)---------

引用 2 楼 firezxm 的回复:
引用 1 楼 greenvesture 的回复:
1.有catch就说明程序可能会中断,也就是不一定会执行return....就好比你在一个if语句中写return一样..你必须保证让程序最后总是能返回一个值..
2.就是你说的这个顺序

-------------------
按照这个顺序的话,无论有没有异常,catch之不执行,一定会执行finally,然后去找try中的return,也一定找的到,也就是无论有没有catch,都会finally,都能找到return!那你说“也就是不一定会执行return”是怎么得来的呢???谢谢!


如果你try中还未执行到return就抛出异常了,你到哪里去找return?
------其他回答(10分)---------

问题二.try catch 执行顺序
记住一点:当执行到return这一步语句的时候,让return等会,先执行finally{},完了再执行return,进行返回。(这样说应该够清楚了)

如:
try{
语句1;
语句2;
语句3;
}catch(){
语句4;
}
finally{
语句5;
}
当语句1抛出异常时,执行顺序:1 4 5
当语句2抛出异常时,执行顺序:1 2 4 5
当语句1、2、3都没有异常时,执行顺序:1 2 3 5
问题一:try和catch是两个平行的分支,
LZ写的例子有可能对初学者有些不理解,就是return id不可能会抛异常。
举个例子:
try{
语句1;
return 返回结果;
}catch(){

}finally{

}
当语句1抛出异常后,"return 返回结果"这句就不会执行了,程序会跳到catch语句中,然后往执行,
请问像这样的话,这个方法不就没有返回结果了吗?!!!所以必须在catch语句里也要有个return语句。
----------
再回到LZ对第一个问题的疑问,
LZ既然写了catch语句,虽然说return id一般不会抛出异常,但是编译器对程序进行语法检测的时候,就认为程序会“有可能”走到catch语句块里的情况,所以报编译不通过。
而要是去掉catch语句块的话,程序只有一条路可走,所以编译器算是通过。

------其他回答(5分)---------

首先说明一下:
1,编译错误,是在运行前按java语法,报的。
2,try-catch-finally,
如果try语句块遇到异常,try下面的代码就不执行了,转而执行catch语句块。
try-finally,
如果try语句块遇到异常,try下面的代码就不执行了.
但是上面2种情况,finally都会在之后被执行
3,return
只要执行了return就会立即结束方法(函数),即使finally没执行也一样。
所以,当JVM在try-catch中遇到return时,就会先执行finally,执行完finally后
再回过头来return.
---当然如果finally中也有return的话,就会执行这个return,并结束方法,
其他的return不会被执行。
关于1题:
try-catch-finally情况:
JVM不确定到底会不会执行catch{},所以强迫catch{},return。就会报编译错误
而try-finally情况:就不会报编译错误

关于2题:
你可以用Eclipse设置个断点验证一下
附,我的测试代码
Java code
 static Object f(){ 
int id = 0;
try {
System.out.println("before");
return id;
} catch (Exception e) {
//throw new Exception();
return 0;
} finally {
System.out.println(123);
return 2;
}


另外在补充一下:
return,和throw new Exception();效果差不多
都是会结束方法,并且都会返回值,(throw是让上一层“捕获到”)
------其他回答(5分)---------

try中的语句块执行,如果抛出了异常,并且程序中有捕获这个异常的catch(),那么转到catch()快中,如果程序中没有捕获这个异常的catch(),jvm退出,很重要的一点是无论在何种情况下(try或者catch中调用了退出jvm的方法除外)finally中的语句都会执行,如果你的finally中有return语句的话,就要小心了,因为即使你的try中也有return的话,它也得不到执行。
一帮的执行顺序是:
1,执行try语句--》如果有异常,try中后面的语句都不会执行了。
2,catch捕捉异常,--》如果没有catch捕捉,程序退出
3,finally,总是要执行的,若try中有return,那么在return执行增强执行finally中的语句,若try和finally中都有return,那么在finally中执行return后程序结束,try中的return得不到执行
------其他回答(1分)---------

引用 12 楼 firezxm 的回复:
4 如果没有catch到异常,就finally,然后一定会找try中的return。如果catch到异常,就不会到try中去找return执行。----------为什么这么规定呢??因为:try中下边的代码是建立在try中上边的没有错误的基础上才执行的。。。你写了catch,则说明try中的return之前的某一句代码可能异常,jvm这个时候就可能到catch中去。而到了catch中之后,try的抛出异常的代码之后的代码是根本不会执行的。。。所以结果是:只要你写了catch,那么return是有可能不会执行到的。所以

楼主,说的对!
------其他回答(1分)---------

LZ要是上面的搞明白了的话,
再帮你拓展一下,加深对这个知识点的认识。
你可以在try语句块中的任意一些地方,
试着加上这句:System.exit(1);
再看看程序运行的结果。。

------其他回答(3分)---------

JAVA异常处理有两种套路:1,捕获try-catch-finally。2,抛出throws
编程时应该先考虑用try-catch,而不是throws
捕获异常的格式:
try{
//可能发生异常的代码....
}catch(xxException e){
//异常发生以后处理的代码
}finally{
//不管发生不发生异常一定要执行的代码
}
finally可以出现1到N次,如果catch不出现就必须出现finally,catch出现了finally随便出现不出现
try只能出现一次,catch出现0-1次
它的运行顺序:
1,如果不发生异常时候执行try-finally
2,发生异常,try必定冲断,到catch
3,发生异常,try冲断到finally
4,发生异常,try冲断catch到finally继续运行下去,因为捕获了异常
try{
1
2
3
}catch(){
4
}
finally{
5
}
6
2若发生异常,则程序执行了1,2,4,5,6执行完毕
方法终结的3种,1,代码执行完了;2,执行到return ;3,有未捕获异常抛出也会终结

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多