編譯器把finally中的return實現爲一個warning。java
但是需要注意的是。通過測試代表:在try 或者catch中的return語句,假設return的是int、long、double常量類型以及String、Integer等的封裝類型,那麼在finally中對return變量的值的改動不會影響在try 或者catch中的return語句的返回結果。post
而剛好相反的是:在在try 或者catch中的return語句。假設return的是List等等對象類型的值,那麼在finally中對其值的改動會影響try 或者catch中的return語句的返回結果。spa
固然, 假設在finally中運行return語句,finally對返回值的改動都會影響返回值。
code
舉例說明1:對象
public static int tryCatchFinallyReturn(){ int a = 1; int b = 100; try{ a = 2; return a+b-2; }catch(Exception e){ e.printStackTrace(); } finally{ System.out.println("finally"); a = 4; System.out.println(a); System.out.println("finally2"); } return a+b; }
main方法: int c = tryCatchFinallyReturn(); System.out.print(c);
finally 4 finally2 100說明儘管a的值改成了4。但try中的返回值並無被改動。
舉例說明2:編譯器
public static List tryTest(){ List<Integer> list = new ArrayList<Integer>(); int a = 2; try{ list.add(new Integer(a)); for(Integer ii :list){ System.out.println(ii.intValue()+"----"); } return list; }catch(Exception e){ e.printStackTrace(); }finally{ System.out.println("finally"); a = 4; System.out.println(a); list.add(new Integer(a)); System.out.println("finally2"); for(Integer ii :list){ System.out.println(ii.intValue()+"----"); } } return list; }
main方法: List<Integer> a = tryTest(); for(Integer b:a){ System.out.println(b.intValue()+"----main"); }
2---- finally 4 finally2 2---- 4---- 2----main 4----main說明影響了對象類型的返回結果。
舉例說明3:io
public static String trytestString(){ String a = "aaa"; String b = "bbb"; try{ a = "aaa2"; return a+b; }catch(Exception e){ e.printStackTrace(); } finally{ System.out.println("finally"); a = "aaa3"; System.out.println(a); System.out.println("finally2"); } return a+b; }
main方法: System.out.println(trytestString());
finally aaa3 finally2 aaa2bbb跟返回常量結果同樣。
public static String trytestString(){ String a = "aaa"; String b = new String("bbb"); try{ a = "aaa2"; return a+b; }catch(Exception e){ e.printStackTrace(); } finally{ System.out.println("finally"); a = "aaa3"+ new String("1122"); System.out.println(a); System.out.println("finally2"); } return a+b; }main:
System.out.println(trytestString());輸出結果:
finally aaa31122 finally2 aaa2bbb