问题是: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{}块结尾处返回。