重要结论:

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. hdu 1520 Anniversary party 基础树dp

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  2. Java解析HTML之HTMLParser使用与详解

    http://blog.csdn.net/jediael_lu/article/details/26285951

  3. UVa12092 Paint the Roads(最小费用最大流)

    题目大概说一个n个点m条带权有向边的图,要给边染色,染色的边形成若干个回路且每个点都恰好属于其中k个回路.问最少要染多少边权和的路. 一个回路里面各个点的入度=出度=1,那么可以猜想知道各个点如果都恰 ...

  4. LightOJ1036 A Refining Company(DP)

    题目大概说有一个n*m的格子地图,每个格子有铀或者镭矿.地图最北面的镭矿加工厂,最西面有铀矿加工厂,而要通过在格子里铺设由南向北(镭)或由东向西(铀)的轨道来送矿物到加工厂.一个格子只能铺设一种轨道, ...

  5. keytool创建Keystore和Trustsotre文件

    一.生成一个含有一个私钥的keystore文件 user@ae01:~$ keytool -genkey -keystore keystore -alias jetty-azkaban -keyalg ...

  6. WPF画线问题,几千条以后就有明显的延迟了。

      我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() {    _path.Data = ...

  7. iOS之01-基本语法

    视频iOS是本人通过视频学习,初期并不是直接使用Xcode,而是在命令行下创建文件.打开文件.编译文件和运行文件. #import <Foundation/Foundation.h> in ...

  8. Js apply 方法 详解

    Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  9. 如何在 ejs 模板中使用 helper function 外部函数进行特殊处理?

    一般我们想要在 ejs 模板中使用外部函数用于特殊的处理,比如:<%= ellipsis(title, 30) %> 通常的做法是: 使用 app.locals 来定义: app.loca ...

  10. leetcode Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...