开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
今天在某客刷Java类题,遇到了一道编程输出的题,下面小编与大家一起分享一下这两道题
第一道题:
题目描述为:以下代码输出结果是什么
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
int temp = 1;
try {
System.out.println(temp);
return ++temp;
} catch (Exception e) {
System.out.println(temp);
return ++temp;
} finally {
++temp;
System.out.println(temp);
}
}
}
小编拿到这一道题心理路程是这样的:
调用test()方法,定义一个变量temp=1,然后进入try的语句块,然后输出temp,先是输出1,然后变量temp进行前置递增,然后temp变为2,然后进入catch语句块,然后输出2,然后在进行return,先保留temp的值为2,然后进入进入finally语句块,然后变量temp在进行前置递增,然后此时temp变为3,然后输出3,所以结果为1、2、3,但是小编对了答案之后发现错误。结果为:1、3、2。
正确答案的理解:
首先先明确try、catch、finally的执行顺序,以及有没有return的执行顺序,规则如下
- finally块一定会执行(除非退出虚拟机),无论是否try…catch。
- finally块前有return,会先执行return语句,并保存下来,再执行finally块,最后return。
- finally块前有return、finally块中也有return,先执行前面的return,保存下来,再执行finally的return,覆盖之前的结果,并返回。
所以这一题正确的执行顺序为:
- 输出try里面的初始temp:1;
- temp=2;
- 保存return里面temp的值:2;
- 执行finally的语句temp:3,输出temp:3;
- 返回try中的return语句,返回存在里面的temp的值:2;
- 输出temp:2。