finally 语句块中, 最好不要使用return, 否则会造成已下后果;
1, 如果catch块中捕获了异常, 并且在catch块中将该异常throw给上级调用者进行处理, 但finally中return了, 那么catch块中的throw就失效了, 上级方法调用者是捕获不到异常的. 见demo如下:
1 public class TestException {
2 public TestException() {
3 }
4
5 boolean testEx() throws Exception {
6 boolean ret = true;
7 try {
8 ret = testEx1();
9 } catch (Exception e) {
10 System.out.println("testEx, catch exception");
11 ret = false;
12 throw e;
13 } finally {
14 System.out.println("testEx, finally; return value=" + ret);
15 return ret;
16 }
17 }
18
19 boolean testEx1() throws Exception {
20 boolean ret = true;
21 try {
22 ret = testEx2();
23 if (!ret) {
24 return false;
25 }
26 System.out.println("testEx1, at the end of try");
27 return ret;
28 } catch (Exception e) {
29 System.out.println("testEx1, catch exception");
30 ret = false;
31 throw e;
32 } finally {
33 System.out.println("testEx1, finally; return value=" + ret);
34 return ret;
35 }
36 }
37
38 boolean testEx2() throws Exception {
39 boolean ret = true;
40 try {
41 int b = 12;
42 int c;
43 for (int i = 2; i >= -2; i--) {
44 c = b / i;
45 System.out.println("i=" + i);
46 }
47 return true;
48 } catch (Exception e) {
49 System.out.println("testEx2, catch exception");
50 ret = false;
51 throw e;
52 } finally {
53 System.out.println("testEx2, finally; return value=" + ret);
54 return ret;
55 }
56 }
57
58 public static void main(String[] args) {
59 TestException testException1 = new TestException();
60 try {
61 testException1.testEx();
62 } catch (Exception e) {
63 e.printStackTrace();
64 }
65 }
66 }
该方法的最终执行结果如下:
i=2i=1testEx2, catch exceptiontestEx2, finally; return value=falsetestEx1, finally; return value=falsetestEx, finally; return value=false
尽管testEx2中的catch抛出异常, 但因为finally中return了, 那么testEx1中是捕获不到异常的, 所以testEx1中的catch块是不会执行的.
2, 如果在finally里的return之前执行了其它return , 那么最终的返回值是finally中的return:
public class TestException3 {
public static int x = 3;
int testEx() throws Exception {
try {
x = 4;
return x;
} catch (Exception e) {
} finally {
x = 5;
return x;
}
}
public static void main(String[] args) {
TestException3 testException3 = new TestException3();
try {
int a = testException3.testEx();
System.out.println(a);
System.out.println(x);
} catch (Exception e) {
}
}
}
输出结果为5, 5
如果finally中的return被注释掉, 那么输出结果是4, 5
