重要结论:

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 4Case 5Case 6只适用于Java语言(会有警告)

最终结论:

任何执行try或者catch中的return语句之前,如果finally语句块存在,都会先执行finally中的语句;如果finally中有return语句,那么程序就直接return了,这样将导致返回值不是try或catch中保存的返回值,为此Java编译器把finally中的return语句实现为一个warning,而在C#则不允许在finally中使用return语句。

有return语句情况下,try-catch-finally的执行顺序的更多相关文章

  1. Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序

    1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...

  2. 有return的情况下try catch finally的执行顺序(转)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  3. 有return的情况下try catch finally的执行顺序

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  4. 有return的情况下try catch finally的执行顺序(最有说服力的总结)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  5. 【Java疑难杂症】有return的情况下try catch finally的执行顺序

    有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...

  6. 有return的情况下try catch finally的执行顺序(转)

    结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  7. [转]有return的情况下try catch finally的执行顺序

    结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...

  8. throw和throws的区别以及try,catch,finally在有return的情况下执行的顺序

    一,抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. (1).系统自动抛异常 1.当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出 ...

  9. 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)

    [转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...

随机推荐

  1. 矩阵快速幂 UVA 10870 Recurrences

    题目传送门 题意:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d,求f (n) % m.训 ...

  2. iOS 含有 中文的URL 转码问题

    非ARC模式下: - (NSString *)encodeToPercentEscapeString: (NSString *) input { NSString *outputStr = (NSSt ...

  3. jQuery入门第二天

    3种选择器:元素选择器:$("button").class选择器:$(".btn").id选择器:$("#target1"). <sc ...

  4. HDU3820 Golden Eggs(最小割)

    题目大概说给一个n*m的格子,每个格子放金蛋或银蛋都会得到不同的价值,当然也可以不放,不过如果存在相邻的两个格子都是金蛋会损失价值g,都是银则损失s.问能得到的最大价值. 有点像二者选一的最小割模型, ...

  5. BZOJ4117 : [Wf2015]Weather Report

    一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可. 每次取出概率最小的,将它个数除以2,对于零头需要特判. #include<cstdio> ...

  6. BZOJ2164 : 采矿

    树链剖分+线段树,每个节点维护以下信息: (1)单独在某个点分配$i$个人的最大收益.可以$O(m)$合并. (2)分配$i$个人的最大收益.可以用$O(m^2)$合并. 时间复杂度$O(c(m^2\ ...

  7. topcoder SRM 623 DIV2 CatAndRat

    解决本题的一个关键点就是当Cat进入时,此时Rat在哪个位置? 注意移动方向可以随时改变,由于是圆环,故离入口最远点的距离是pi*R,即圆的一半, 当cat进入时(cat的速度大于rat的速度,否则不 ...

  8. 不错的 iOS 开发辅助工具

    一,常用 1>  iPhone 日志插件iConsole.

  9. js-小效果-手风琴

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  10. UVA 558 判定负环,spfa模板题

    1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...