try catch finally 一個小測試
阿新 • • 發佈:2019-02-16
之前沒有注意到,現在記錄下
try{
}catch{
}finally{
}
這種結構,大家都知道finally一定會執行,但如果涉及到return result 這種返回值的方法時,是有點差別的
正常的如下:
private static String testString(){ String s = "0000000000"; try{ System.out.println("111111111111111111111111"); s = "1111111111"; return s; }catch (Exception e){ System.out.println("222222222222222"); }finally { System.out.println("333333333333333333333"); s = "33333333333"; } System.out.println("44444444444444444444444"); s = "4444444444"; return s; }
這種String 返回值 的 try catch finally 塊,大家很容易分析出來
1. finally 裡面的肯定會執行
2. return 後面的程式碼(finally除外)不再執行
測試:
System.out.println("testString:"+testString());
結果:
111111111111111111111111
333333333333333333333
testString:1111111111
複合結構:
private static Map testMap(){ Map m = new HashMap(); try{ System.out.println("111111111111111111111111"); m.put("aaa", "1111111111"); return m; }catch (Exception e){ System.out.println("222222222222222"); }finally { System.out.println("333333333333333333333"); m.put("aaa", "33333"); } System.out.println("44444444444444444444444"); m.put("aaa", "4444"); return m; }
直接測試:
System.out.println("testMap:"+testMap());
結果:
111111111111111111111111
333333333333333333333
testMap:{aaa=33333}
唯一變化的就是返回值,不像前面String那樣,返回的是return 語句執行到時變數的值
而是finally塊執行完後的值,個人感覺是因為變數是引用的原因
同理驗證了List
private static List testList(){ List list = new ArrayList(); list.add("0000000000"); try{ System.out.println("111111111111111111111111"); list.add("1111111111"); return list; }catch (Exception e){ System.out.println("222222222222222"); }finally { System.out.println("333333333333333333333"); list.add("333333333333"); } System.out.println("44444444444444444444444"); list.add("44444444444444"); return list; }
結果:
111111111111111111111111
333333333333333333333
testList:[0000000000, 1111111111, 333333333333]
同上面分析一樣
於是聯想到是不是將String s = “111111111”,變為String s = new String(“111111111”)。
private static String testStringObj(){
String s = new String("0000000000");
try{
System.out.println("111111111111111111111111");
s = new String("1111111111");
return s;
}catch (Exception e){
System.out.println("222222222222222");
}finally {
System.out.println("333333333333333333333");
s = new String("33333333333");
}
System.out.println("44444444444444444444444");
s = new String("4444444444");
return s;
}
結果:
111111111111111111111111
333333333333333333333
testStringObj:1111111111
竟然沒什麼變化,不符合預期。
目前個人感覺可能同String 這個比較特殊,或者因為String是 final的,後續有時間研究下(剛才又被催幹活了),或者研究過的同學給說下,多謝多謝!