一、第一次試驗
public static void main(String[] args) throws InterruptedException {System.out.println(aaa(null));}private static StringBuilder aaa(Integer i) throws InterruptedException {StringBuilder sb = new StringBuilder();try {i.toString();return sb;} catch (Exception e) {sb.append("1");return sb;}finally {sb.append("2");Thread.sleep(5000);System.out.println("sb:" + sb);}}
結果為
sb:12
12
二、第二次試驗
public static void main(String[] args) throws InterruptedException {System.out.println(aaa(null));}private static String aaa(Integer i) throws InterruptedException {String a;try {i.toString();a = "1";return a;} catch (Exception e) {a = "2";return a;}finally {a = "3";Thread.sleep(5000);System.out.println("a: " + a);}}
結果為
a: 3
2
三、分析
1、通過線程睡眠可以判斷出 finally 在 return 前執行的
2、return 后面的代碼 會根據所在行先后順序執行, return的是堆里的對象
3、第一個實驗因為修改了堆里的對象所以影響了最終結果
四、驗證
private static String aaa(Integer i) throws InterruptedException {String a;try {i.toString();a = "1";return a;} catch (Exception e) {a = "2";}finally {a = "3";Thread.sleep(5000);System.out.println("a: " + a);}return a;}
結果為
a: 3
3
結論正確