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. 循环调用修正sic86

    create or replace procedure rebuild_sic86_wyl(pi_aac001 in number, po_fhz out varchar2, po_msg out v ...

  2. MySQL 出现 The table is full 的解决方法

    原文链接: MySQL 出现 The table is full 的解决方法 浅谈MySql的存储引擎(表类型) MySQL 出现 The table is full 只有一个原因,对应的表数据容量达 ...

  3. PHP学习笔记1-常量,函数

    常量:使用const(php5)声明,只能被赋值一次,php5以下版本使用define: <?php const THE_VALUE = 100;//PHP5中才有const echo THE_ ...

  4. ZOJ 3204 Connect them MST-Kruscal

    这道题目麻烦在输出的时候需要按照字典序输出,不过写了 Compare 函数还是比较简单的 因为是裸的 Kruscal ,所以就直接上代码了- Source Code : //#pragma comme ...

  5. js中innerHTML与innerText的用法与区别

    用法: <div id="test">    <span style="color:red">test1</span> te ...

  6. 利用SolrJ操作solr API完成index操作

    使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...

  7. 为什么C语言在2013年仍然很重要:一个简单的例子

    附注:在最初的文章里,我没说明进行模2^64的计算——我当然明白那些不是“正确的”斐波那契数列,其实我不是想分析大数,我只是想探寻编译器产生的代码和计算机体系结构而已. 最近,我一直在开发Dynvm— ...

  8. IBM Python 技术专题

    Python 技术专题 Python 是由 Guido van Rossum 开发的,可免费获得的.是一种非常高级的解释型语言.其语法简单易懂,而且面向对象的语义功能强大又灵活,Python 可以广泛 ...

  9. 动态规划之插头DP入门

    基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用0或者1来表示未使用.使用两种状态,而是使用数字来表示类似插头的状态,因此.它又被 ...

  10. 在OpenShift平台开发Node.js程序

    设置process.env方便本地调试 --------------------- 修改~/.profile,增加下面两行,然后执行`. ~/.profile`: export OPENSHIFT_N ...