含有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分)--------- 修改一下 很简单,f因为有catch,所以编译器就会认为try里面的return有可能是无效的;f2没有catch,try里面也没有会抛出非运行时异常(IOException,NumberFormatException。。。)的代码,所以编译器认为try里面的return是必定会被执行的,所以不管finally有没有return,f2都可以编译通过 ------其他回答(5分)--------- return id;,这句代码看是一行代码,先执行id再执行return。执行id的时候引发了异常,就跳转到catch。 在return还没有执行完,引发了异常,中断了return,进入了catch里。执行catch里的处理,这时候return并没有返回,而被中断了.所以你最终还是没有返回int.你可以在if块最后加上return 0; ------其他回答(5分)--------- 如果你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设置个断点验证一下 附,我的测试代码
另外在补充一下: 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分)--------- 楼主,说的对! ------其他回答(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,有未捕获异常抛出也会终结 |
|
来自: JUST SO LAZY > 《java\android》