直入正题,测试程序以下,看执行结果和你想的是否一致?函数
public class ReturnTest { public static void main(String[] args) { System.out.println("=============test1=================="); System.out.println(test1()); System.out.println("==============================="); System.out.println("=============test1_1=================="); System.out.println(test1_1()); System.out.println("==============================="); System.out.println("\n============test2==================="); System.out.println(test2()); System.out.println("==============================="); System.out.println("\n============test2_1==================="); System.out.println(test2_1()); System.out.println("==============================="); System.out.println("\n============test3==================="); System.out.println(test3()); System.out.println("==============================="); System.out.println("\n============test3_1==================="); System.out.println(test3_1()); System.out.println("==============================="); } public static String test1() { String a = "in try"; try { return a; } catch (Exception e) { } finally { a = "in finally"; System.out.println("do finally"); } return a; } public static String test1_1() { String a = "in try"; try { return a; } catch (Exception e) { } finally { a = "in finally"; System.out.println("do finally"); return a; } } public static int test2() { int a = 1; try { return a; } catch (Exception e) { } finally { a = 2; System.out.println("do finally"); } return a; } public static int test2_1() { int a = 1; try { return a; } catch (Exception e) { } finally { a = 2; System.out.println("do finally"); return a; } } public static Helper test3() { Helper a = new Helper(); a.a = 1; try { return a; } catch (Exception e) { } finally { a.a = 2; System.out.println("do finally"); } return a; } public static Helper test3_1() { Helper a = new Helper(); a.a = 1; try { return a; } catch (Exception e) { } finally { a.a = 2; System.out.println("do finally"); return a; } } static class Helper { int a; public String toString() { return String.valueOf(a); } } }
结果以下:测试
=============test1================== do finally in try =============================== =============test1_1================== do finally in finally =============================== ============test2=================== do finally 1 =============================== ============test2_1=================== do finally 2 =============================== ============test3=================== do finally 2 =============================== ============test3_1=================== do finally 2 ===============================
很好理解了。code
#结论:io
在try catch块里return的时候,finally也会被执行。class
return 语句会把后面的值复制到一份用来返回,若是return的是基本类型的,finally里对变量的改动将不起效果,若是return 的是引用类型的,改动将能够起效果。test
finally里的return语句会把try catch块里的return语句效果给覆盖掉。变量
看来return语句并不必定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去了。看来最佳实践是:引用
最好把return放到方法尾而不要在try cath 里return程序
不要在try catch块和finally块里都包含return方法
若是在try catch块里return, 则不要在finally块里操做被return的变量