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. application(expand)--easyui

    一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...

  2. Oracle 专用模式(DEDICATED) 和 共享模式(SHARE) (转)

    Oracle 是一门博大精深的技术.玩了2年的oracle,依旧还有很多知识点不清楚. 昨天群里的朋友提到了 DEDICATED 和 SHARE 两种模式. 不清楚,默默的做点功课了.从网上搜了点知识 ...

  3. 【Android UI】色板

    Hex Code Color #FFFFFF   #FFFFCC   #FFFF99   #FFFF66   #FFFF33   #FFFF00   #FFCCFF   #FFCCCC   #FFCC ...

  4. nginx启动过程分析

    nginx的启动过程紧紧环绕着ngx_cycle_t的结构体展开,首先通过ngx_get_options()获取命令行參数.然后通过ngx_time_init()进行时间的初始化.如全局变量ngx_c ...

  5. 找唯一不出现三次而出现1次的数子O(n)位运算算法

    之前两次那个是异或运算处理.这次以为也是类似.可是没想出来. 高富帅想出来了算法,转为bitset,然后加起来 同样的话 要么0+0+0 要么1+1+1,最后剩下的 能够通过%3 算出0 或1.思想是 ...

  6. 新买一款打印机hp5525N

    11900 RMB 彩色.激光.彩打. 让法国的工艺工程师给改成法语的了.

  7. HDU1005(周期问题)

    Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...

  8. WinDbg分析DUMP文件

    1. 如何生成dump文件?     原理:通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件:       ...

  9. 【转】CentOS上安装 jdk:rpm安装和源码安装

    1.安装 jdk-8u5-linux-x64.rpm 原文链接:http://www.cnblogs.com/xsi640/p/3756995.html 先下载最新的jdk版本 文件名:jdk-8u5 ...

  10. Android NumberPicker和DatePicker分割线颜色设置

    NumberPicker /** * * 设置选择器的分割线颜色 * * @param numberPicker */ private void setDatePickerDividerColor(N ...