try、catch、finally执行顺序

try中有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
26
27
28
29
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
}
return num;
}
}
// 输出结果:
// 进入--> try
// try方法--> num=1
// 进入--> finally
// finally方法--> num=3
// 返回结果:1

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
26
27
28
29
30
31
32
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
// 产生异常
int i = 1/0;
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
}
}
}
// 输出结果:
// 进入--> try
// 进入--> catch
// catch方法--> num=2
// 进入--> finally
// finally方法--> num=3
// 返回结果:2

finally中有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
26
27
28
29
30
31
32
33
34
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
num = 1;
System.out.println("try方法--> num=" + num);
// 产生异常
int i = 1/0;
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
return num;
}
}
}
// 输出结果:
// 进入--> try
// try方法--> num=1
// 进入--> catch
// catch方法--> num=2
// 进入--> finally
// finally方法--> num=3
// 返回结果:3

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
26
27
28
29
30
31
32
33
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+ArrayUtil.toString(test()));
}
public static List<String> test(){
List<String> list = new ArrayList<>();
try {
System.out.println("进入--> try ");
list.add("try");
System.out.println("try方法--> list=" + ArrayUtil.toString(list));
// 产生异常
int i = 1/0;
return list;
} catch (Exception e) {
System.out.println("进入--> catch ");
list.add("catch");
System.out.println("catch方法--> list=" + ArrayUtil.toString(list));
} finally {
System.out.println("进入--> finally ");
list.add("finally");
System.out.println("finally方法--> list=" + ArrayUtil.toString(list));
}
return list;
}
}
// 输出结果:
// 进入--> try
// try方法--> list=[try]
// 进入--> catch
// catch方法--> list=[try, catch]
// 进入--> finally
// finally方法--> list=[try, catch, finally]
// 返回结果:[try, catch, finally]

程序退出或其他导致程序中断

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
26
27
28
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
// 退出程序
System.exit(0);
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
return num;
}
}
}
// 输出结果:
// 进入--> try

总结:

  1. 执行顺序:try –> catch(如果有异常)–> finally –> finally中的return –> try/catch中的return
  2. finally中有return时,会直接在finally中退出,导致try、catch中的return失效
  3. finally不一定会被执行,比如手动调用System.exit(0)或栈溢出、内存溢出等其他导致程序中断的情况
  4. 需要注意return返回值的类型,是否会受到finally中代码的影响
    1. 如果是基本数据类型:当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息
    2. 如果是对象:return中保存的是对象的引用地址,当在finally中改变对象的属性时,return返回的对象也会跟着改变