有這么一段代碼,在執行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++; } }
