Java刷题入坑

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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,覆盖之前的结果,并返回。
    所以这一题正确的执行顺序为:
  1. 输出try里面的初始temp:1;
  2. temp=2;
  3. 保存return里面temp的值:2;
  4. 执行finally的语句temp:3,输出temp:3;
  5. 返回try中的return语句,返回存在里面的temp的值:2;
  6. 输出temp:2。