重要结论:

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. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  2. footer元素

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

  3. BZOJ4631 : 踩气球

    将所有盒子插入链表,每当一个盒子变空时,从链表里删去它. 查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的. 每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段 ...

  4. ubuntu server下建立分区表/分区/格式化/自动挂载(转)

    link:http://www.thxopen.com/linux/2014/03/30/Linux_parted.html 流程为:新建分区-->格式化分区-->挂载分区 首先弄明白分区 ...

  5. Oracle 存储过程学习

    转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...

  6. java中流转化为Object可序列化

    一.PO实体类 public class buisPO{ /** * 业务数据 */ private Bolb buisData; public Blob getBusiData() { return ...

  7. Collections.sort的三种用法

    /** * @author guwh * @version 创建时间:2011-11-3 上午10:49:36 * 类说明 */ package com.jabberchina.test; impor ...

  8. 【BZOJ】3434: [Wc2014]时空穿梭

    http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m ...

  9. UVA 11461 - Square Numbers(水题)

    题目链接 #include <cstdio> #include <cstring> #include <string> #include <cmath> ...

  10. ffmpeg入门

    总入口 http://blog.csdn.net/leixiaohua1020/article/details/15811977 各结构体介绍 http://blog.csdn.net/leixiao ...