关于Java中try…catch…finally的面试题

一、问题

try...catch...finally

二、解答

1)try中间有返回值,那么finally还执行吗

finally中的代码块都会执行,不管try中有没有return,也不管有没有出现异常。

这个大家都知道,通常这个finally关键字,都是用来释放资源的,比如关闭流。

2)如果try中间有return返回,finally中间也有,会发生什么

这个问题有点困扰,平常我们不会这样写代码,正如上面说的,我们通常是用来释放资源的。

但如果在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
package com.banmoon.finallytest;

import org.junit.Test;

public class FinallyTest {

@Test
public void test() {
System.out.println(finallyIntGet(1));
System.out.println(finallyIntGet(0));
}

public static int finallyIntGet(int n) {
int num = 0;
try {
if (n == 0) {
throw new Exception();
}
return num;
} catch (Exception e) {
return -1;
} finally {
num = 1;
return num;
}

}

}

在心中想一想它俩的答案,我这边直接放出来了

image-20230812104045102

这就说明,如果finally当中有返回的话,那将以finally的返回值为准。

那么finally执行的时间点是什么时候??

是这样子的,当上面的代码块进行return时,会将这个返回值保存起来,先去执行finally中的代码。

如果finally中有return,那就会替换掉上面保存的返回值,以finally的返回值为准

3)如果try中间有return返回一个变量,在finally中修改这个变量,会发生什么

我们将上面代码中的return注释掉,只保留上面的两个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
package com.banmoon.finallytest;

import org.junit.Test;

public class FinallyTest {

@Test
public void test() {
System.out.println(finallyIntGet(1));
System.out.println(finallyIntGet(0));
}

public static int finallyIntGet(int n) {
int num = 0;
try {
if (n == 0) {
throw new Exception();
}
return num;
} catch (Exception e) {
return -1;
} finally {
num = 1;
}

}

}

image-20230812104650370

可以看到,改变变量值并不能改变,上面return时保存下来的值

三、最后

我是半月,你我一同共勉!!!