try{}catch{}finally{}中加入return后的执行顺序

原创 2007年09月15日 00:18:00

在网上看到一些关于在try{}catch{}finally{}中加入return后的执行顺序的讨论,不衷一是,于是自己写了个例子测试,过程和结论如下。  

  在try{}catch{}finally{}程序中,无论是否发生异常且无论try或catch语句块中包含什么代码("System.exit();"除外),finally语句块中的代码都会被执行。但当try语句块中包含return语句时执行顺序有点不一样。

  场景一:   


public class TestFinally ...{

    
public static void main(String[] args) ...
{
        System.out.print(returnValue());
    }

    
    
public static int returnValue()...{
        
int i = 0;                // L1

        try...{                
            i 
= 1;                // L2

            return i = i + 5;    // L3
        }
 finally ...{            
            i 
= 2;                // L4

        }

    }

}

          returnValue()方法中的语句执行顺序为"L1, L2, L3, L4, L3",最后执行的是try语句块中的return语句,但returnValue()的返回值是6,看起来似乎finally语句块中对变量i的赋值未起作用,但实际上Debug的话会发现执行完finally语句块后转到return语句时变量i的值是新值2,但为什么return的是6呢?个人分析认为这是因为每一次执行L3时实际上不执行return,而是执行了"i = i + 5;"(这时i==6)并将i值存入某个临时变量 "xTemp = i; "(xTemp == 6),而后执行了finally中的 "i = 2;",最后执行try语句块中的return语句实际上"return xTemp;"。

  场景二:


public class TestFinally ...{

    
public static void main(String[] args) ...
{
        System.out.print(returnValue());
    }

    
    
public static int returnValue()...{
        
int i = 0;                // L1

        try...{                
            i 
= 1;                // L2

            return i = i + 5;    // L3
        }
 finally ...{            
            i++;                  // L4

            return i;            // L5
        }

    }

}

  此时returnValue()方法中的语句执行顺序为"L1, L2, L3, L4, L5",最后执行的是finally语句块中的return语句,返回值是7。即try语句块中的return语句中的"i = i + 5;"得到了执行,最后由finally语句块中的return语句返回,try语句块中的return的返回功能不起作用了。

Java异常捕获之try-catch-finally-return的执行顺序

情况1:try块中没有抛出异常try和finally块中都有return语句 public static int NoException(){ int i=10; try{ S...
  • aaoxue
  • aaoxue
  • 2013年01月23日 21:45
  • 11956

有return的情况下try catch finally的执行顺序

背景:          昨天一个朋友出去面试,遇到这么一道题:“C#  catch里有return,finally里还执行吗?” 个人实践小结:         1、不管有木有出现异常,finall...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年08月22日 08:08
  • 2313

try、catch、finally中return的执行顺序

try、catch、finally中的return        今天在做一个多线程加读写锁的测试时,考虑效率问题,想及时return结果,但存在一个严肃的问题,那就是锁的开启和关闭问题。因为锁开启后...
  • wangqingbo0829
  • wangqingbo0829
  • 2016年09月07日 12:33
  • 2086

Java try/catch/finally代码块中加入return后的执行顺序问题

finally可以分两方面理解 1.执行时机问题。finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catch后面执行 2.返回值问题。可以认...
  • PapperMan
  • PapperMan
  • 2016年05月19日 19:20
  • 482

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论: 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行...
  • Yelbosh
  • Yelbosh
  • 2016年08月01日 21:39
  • 254

有return的情况下try catch finally的执行顺序

结论: 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行...
  • accountable
  • accountable
  • 2016年07月26日 14:46
  • 95

有return的情况下try catch finally的执行顺序

结论: 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行的(此...
  • BehandTheTime
  • BehandTheTime
  • 2016年10月18日 15:05
  • 207

有return的情况下try catch finally的执行顺序(最有说服力的总结)

有return的情况下try catch finally的执行顺序(最有说服力的总结)
  • myloveheqiaozhi
  • myloveheqiaozhi
  • 2017年03月06日 09:29
  • 133

有return的情况下try catch finally的执行顺序

背景:          昨天一个朋友出去面试,遇到这么一道题:“C#  catch里有return,finally里还执行吗?” 个人实践小结:         1、不管有木有出现异常,finall...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年08月22日 08:08
  • 2313

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论: 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行...
  • hu948162999
  • hu948162999
  • 2015年01月07日 18:32
  • 509
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:try{}catch{}finally{}中加入return后的执行顺序
举报原因:
原因补充:

(最多只允许输入30个字)