有return语句情况下,try-catch-finally的执行顺序
重要结论:
1.不管有没有出现异常,finally块中代码都会执行
2.当try和catch中有return时,finally仍然会执行
3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),即:函数返回值是在finally执行前确定的
4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
举例分析:
Case 1:try{} catch(){}finally{} return;
程序按顺序执行。
Case 2:try{return;}catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)的代码,
再执行finally块,最后执行try中return;
因为程序在try中已经return,所以不再执行finally块之后的return语句。
Case 3:try{} catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:执行catch中return之前(包括return语句中的表达式运算)的代码,
再执行finally语句中全部代码,最后执行catch块中return,
finally之后的return语句不再执行。
无异常:执行完try再finally再return
*Case 4:try{return;}catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)的代码,
再执行finally块,因为finally块中有return所以提前退出。
*Case 5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)的代码,
再执行finally块,因为finally块中有return所以提前退出。
*Case 6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)的代码,
有异常:再执行catch块中return之前(包括return语句中的表达式运算)的代码,
再执行finally块,因为finally块中有return所以提前退出。
无异常:再执行finally块,因为finally块中有return所以提前退出。
*注:由于C#编译器不允许在finally中使用return语句,所以Case 4、Case 5、Case 6只适用于Java语言(会有警告)
最终结论:
任何执行try或者catch中的return语句之前,如果finally语句块存在,都会先执行finally中的语句;如果finally中有return语句,那么程序就直接return了,这样将导致返回值不是try或catch中保存的返回值,为此Java编译器把finally中的return语句实现为一个warning,而在C#则不允许在finally中使用return语句。
有return语句情况下,try-catch-finally的执行顺序的更多相关文章
- Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序
1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...
- 有return的情况下try catch finally的执行顺序(转)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 有return的情况下try catch finally的执行顺序
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 【Java疑难杂症】有return的情况下try catch finally的执行顺序
有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...
- 有return的情况下try catch finally的执行顺序(转)
结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- [转]有return的情况下try catch finally的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...
- throw和throws的区别以及try,catch,finally在有return的情况下执行的顺序
一,抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. (1).系统自动抛异常 1.当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出 ...
- 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)
[转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...
随机推荐
- 矩阵快速幂 UVA 10870 Recurrences
题目传送门 题意:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d,求f (n) % m.训 ...
- iOS 含有 中文的URL 转码问题
非ARC模式下: - (NSString *)encodeToPercentEscapeString: (NSString *) input { NSString *outputStr = (NSSt ...
- jQuery入门第二天
3种选择器:元素选择器:$("button").class选择器:$(".btn").id选择器:$("#target1"). <sc ...
- HDU3820 Golden Eggs(最小割)
题目大概说给一个n*m的格子,每个格子放金蛋或银蛋都会得到不同的价值,当然也可以不放,不过如果存在相邻的两个格子都是金蛋会损失价值g,都是银则损失s.问能得到的最大价值. 有点像二者选一的最小割模型, ...
- BZOJ4117 : [Wf2015]Weather Report
一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可. 每次取出概率最小的,将它个数除以2,对于零头需要特判. #include<cstdio> ...
- BZOJ2164 : 采矿
树链剖分+线段树,每个节点维护以下信息: (1)单独在某个点分配$i$个人的最大收益.可以$O(m)$合并. (2)分配$i$个人的最大收益.可以用$O(m^2)$合并. 时间复杂度$O(c(m^2\ ...
- topcoder SRM 623 DIV2 CatAndRat
解决本题的一个关键点就是当Cat进入时,此时Rat在哪个位置? 注意移动方向可以随时改变,由于是圆环,故离入口最远点的距离是pi*R,即圆的一半, 当cat进入时(cat的速度大于rat的速度,否则不 ...
- 不错的 iOS 开发辅助工具
一,常用 1> iPhone 日志插件iConsole.
- js-小效果-手风琴
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- UVA 558 判定负环,spfa模板题
1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...