有这么一段代码,在执行func方法后在Test中打印返回值。
public int func(){ int i = 0; try { i++; throw new Exception(); }catch (Exception e){ return i++; }finally { i++; } }
@Test public void test(){ System.out.println(func()); }
执行结果:1
按照往常的想法,原以为,return 返回之前会先进行运算,所以会去考虑i++之后的值,以及finally 内的代码,这是错误的。
进行断点调试后,发现在执行catch中的return之前会先执行finally,而返回的值却是i运算之前的值。原来是因为在执行return的时候
会先i的值赋值给一个中间变量,然后再去执行其他代码,最终再将这个中间变量返回。所以即使在return之前 i 进行了运算也不会改变 return 出去的值。
以上代码可以用以下代码具体的展示。
public int func(){ int i = 0; try { i++; throw new Exception(); }catch (Exception e){ // 在return之前将i++赋值给一个中间变量,即 temp = 1; int temp = i++; return temp; }finally { i++; } }