一个常见的问题,混淆的答案

问题是:try{} 里有一个return语句, 那么紧跟这个try后的finally{}里的code会不会被执行,什么时候被执行, 在return前还是后?

有回答是:finally块先于return执行。 

这个问题可以用一个小实验得到解答

int result =  test(); 

}

private int  test() 
{ 
    int i = 0; 
    int j = 0; 
    try 
    { 
        ++i; 
        ++j; 
        return i+j; 
    } 
    catch 
    { 
        --i; 
        return i+j; 
    } 
    finally 
    { 
        ++i; 
    } 

这段代码的test()返回值是2,而不是3, 可见 try {}里的 return i+j 里的表达式先求值,然后放到一个暂存变量,之后转到finally{} 块里的代码继续执行,执行完后跳回try{}块结尾,并把转存变量返回

下面的情况是try{}块里发生了异常

int result =  test(); 

}

private int  test() 
{ 
    int i = 0; 
    int j = 0; 
    try 
    { 
        ++i; 
        ++j; 
        throw new Exception(); 
        return i+j; 
    } 
    catch 
    { 
        --i; 
        return i+j; 
    } 
    finally 
    { 
        ++i; 
    } 

这段代码的异常出现后,跳到catch{}块执行,之后跳到finally{}块执行, 之后跳回catch{}块结尾处返回。

原文地址:https://www.cnblogs.com/grkin/p/3393190.html