`
- 浏览:
2350 次
-
有return的情况下try catch finally的执行顺序
结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。举例:
情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。
下面是个测试程序
public class FinallyTest
{
public static void main(String[] args) {
System.out.println(new FinallyTest().test());;
}
static int test()
{
int x = 1;
try
{
x++;
return x;
}
finally
{
++x;
}
}
}
结果是2。
分析:
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
它应该使用栈保存返回值。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
try、catch、finally、return 执行顺序超详细讲解,包看包会。
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出
第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回) 第二:finally里面不建议放return语句,根据需要,return语句...
The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的...),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种情况下return语句后不能再有其它的语句了
finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...
3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...
- 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally
主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。
catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句 所捕获。在所有的处理结束后,执行finally语句。 在一个try………end try 过程中可以使用catch与finally两个中的一 个,或者两个一起用, 二...
ublic SqlConnection lianjie()//数据库链接 { ... try { com.ExecuteNonQuery();//执行sql命令 return true; } catch { return false; } finally { con.Close();//关闭数据库 }
异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try … catch … finally来处理异常,在Python中通过try … except … else来处理异常 一、以ZeroDivisionError为例,处理分母为...
8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA。 10. 常见的 RuntimeException 有哪些? 11. Java常见异常有哪些 四、并发...
return connstr; } public bool excutesql(string sql) //返回影响的行数 { try { conn = new SqlConnection(getconn()); conn.Open(); } catch { MessageBox.Show("数据连接失败", "温馨提示"); } ...
4、 通过实验,对Java程序的开发有一个深入了解。 二、实验内容 1.阅读并分析程序TestException.java。(见附件PPT文件) 2.设计一个程序,其功能是从命令行输入整数字符串,再将该整数字符串转换为整数, 输入的...
03 try-catch优化为try-catch-finally简化 04 辅助功能-return简写表达式还原,便于阅读理解 05 新增:大数组多解密函数(需要先自行排版,大数组-偏移函数-解密函数1-解密函数2-解密函数3) 06 修复bug-未修改常量...