以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例。
掌握下面几条原则就可以完全解决“当try、catch、finally遭遇return”的问题。
原则:1、finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行。
2、 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行)、finally语句块。
3、函数必须确保有唯一返回值
说明: try中如果包含return语句则catch块和finally块中必须至少有一个含有return语句。或者try中通过throw new Exception();抛出异常,则catch与finally中至少有一个return语句。因为try块会假定其中发生异常,且try块中的代码要么顺利执行,要么抛出异常。如果只在try块中包含return语句不能保证函数有返回值(如try抛出时,return语句不会执行)。所以为了保证函数具有返回值,java强制要求原则。
4、return语句的优先级是finally最大,且try与catch块中只有两者之一的return语句会被执行。为保证函数只有一个返回值则返回优先级最大的值。
下面通过例子讲解上面的三条原则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class TestReturn { public static void main(String[] args) { TestReturn t1 = new TestReturn(); int k = 0 ; System.out.println(t1.test1(k)); } public int test1 ( int k) { try { k = k + 1 ; System.out.println( "try" + k); return k; } catch (Exception e) { k = k + 2 ; System.out.println( "catch" + k); return k; } finally { k = k + 3 ; System.out.println( "finally" + k); return k; } } } |
结果:
try1
finally4
4
说明:try中执行完输出后,由于其return优先级并不最高,所以不会返回,继续执行finally语句块并返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class TestReturn { public static void main(String[] args) { TestReturn t1 = new TestReturn(); int k = 0 ; System.out.println(t1.test1(k)); } public int test1 ( int k) { try { throw new Exception(); } catch (Exception e) { k = k + 2 ; System.out.println( "catch" + k); return k; } finally { k = k + 3 ; System.out.println( "finally" + k); return k; } } } |
结果:
catch2
finally5
5