try..catch..finally这个语法大家都很熟悉,就是捕捉异常、处理异常,面试中经常被问到的一个问题是:如果在try...catch中的某某地方return了,那么之后的某某步骤还会不会执行。今天就来用代码分析一下各种可能的执行情况,懒得看文章的话,直接看最后的总结,如果不明白再回头看文章。

1.首先要明确一个,在finally里面是不能执行return语句的,如果在finally中使用了return,则会提示这样的错误:“控制不能离开 finally子句主体”。如图1:  

              

                  图1

2.只有try中有return语句

当一个捕捉异常语句中只有try语句中有return时,如下代码:

private string   tryFun(int num)
{
int result = ;
try
{
result = / num;
return "";
}
catch
{
}
finally
{ }
return "-2";
}

如果这时候num的值为0,则会出现除0的异常,则return “1”不执行,而去执行catch,因为此时假设只有try中有return语句,所以当catch执行完之后将会执行函数最后的return “-2”语句;如果try语句块中没有异常,则return "-2"语句不执行。

3.只有catch中有return语句

当一个捕捉异常语句中只有catch语句中有return时,如下代码:

private string   tryFun(int num)
{
int result = ;
try
{
result = / num;
}
catch
{
return "-1";
}
finally
{ }
return "-2";
}

如果这时候num的值为0,则会出现除0的异常,则去执行catch,因为此时假设只有catch中有return语句,所以当catch执行完之后直接return “-1”,就不执行finally之后的语句(finally块中的语句肯定是会执行的),也就是在这里return “-2”语句不执行。

4.当try...catch中都有return语句

当try...catch中都有return语句,代码如下:

 private string   tryFun(int num)
{
int result = ;
try
{
result = / num;
return "try";
}
catch
{
return "catch";
}
finally
{
}
return "-2";
}

这时,不管执行的是try还是catch中的语句,return “-2”永远都不执行,也就是finally之后的语句都不执行了(finally里面的语句肯定还是执行啦)。

总结:不管是执行try还是catch,finally中的语句肯定是会执行的;不管是执行try还是catch,如果所执行的语句中(try和catch中的return只有一个会执行,如果被catch了,肯定是执行catch语句中的return;如果没有被catch,那肯定是执行try中的return。这里假设它们中有return,如果没有return,肯定会执行finally后面的语句)有return语句,则finally之后的语句就不执行(finally里面的语句肯定还是执行啦);如果是执行try或catch中的语句块没有return语句,则finally后面的语句还是会执行的。

try..catch..finally执行顺序return的更多相关文章

  1. try catch finally执行顺序 (return / 变量覆盖)

    finally有return 始终返回finally中的return 抛弃 try 与catch中的return 情况1:try{} catch(){}finally{} return x; try{ ...

  2. 异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

    异常处理 try...catch...finally 执行顺序, 以及对返回值得影响 结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,fina ...

  3. try catch finally 执行顺序面试题总结

    在网上看到一些异常处理的面试题,试着总结一下,先看下面代码,把这个方法在main中进行调用打印返回结果,看看结果输出什么. public static int testBasic(){ int i = ...

  4. try catch finally执行顺序

    1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return表达式运算后前执行的,所以函数返回值 ...

  5. JAVA代码中加了Try...Catch的执行顺序

    public static String getString(){ try { //return "a" + 1/0; return "a"; } catch ...

  6. try,catch,finally含return时的执行顺序及丢失的伪例

    最近面试遇到一个之前也看到过但没去看一下的问题.就是有return情况下的try,catch,finally的执行顺序. 今天写了下. 先看顺序问题.总结如下: 一:finally中没有写return ...

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

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

  8. 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序

    大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...

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

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

随机推荐

  1. BZOJ 1552: [Cerc2007]robotic sort( splay )

    kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...

  2. Oracle 游标疑问

    procedure1: CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL(PI_AAB001 IN NUMBER, PO_FHZ OUT VARCH ...

  3. Spring+EhCache缓存实例(详细讲解+源码下载)(转)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  4. php language construct 语言构造器

    isset和empty看起来像是函数,我们也经常把它当作函数一样使用,但是实际上,它们是语言构造器. php中的语言构造器就相当于C中的预定义宏的意思,它属于php语言内部定义的关键词,不可以被修改, ...

  5. SICP中sqrt(开方)的实现(附C#实现)

    #lang racket (define (square x) (* x x)) (define (sqrt-iter guess x) (if (good-enough? guess x) gues ...

  6. 使用java对执行命令行 或 执行bat文件

    public class Hellotianhao { public static void main(String[] args) throws Exception{ System.out.prin ...

  7. 01-UIKit

    目录: 一.视图和控制器 二.interface Builder 回到顶部 一.视图和控制器 1 视图(view)ios程序运行期间用户所能看见的东西都可以认为是视图,比如UIwindow就是一个视图 ...

  8. TimeUnit

    转http://blog.csdn.net/hudashi/article/details/6936604 public enum TimeUnitextends Enum<TimeUnit&g ...

  9. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  10. boost 分析命令行参数

    #include <boost/program_options.hpp> #include <iostream> #include <vector> using n ...