MST

星途 面试题库

面试题:Java中finally块在try中有return语句时的执行时机

在Java程序中,当try块中有return语句时,finally块在何时执行?请通过代码示例说明finally块执行前后对return值的影响。
31.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java程序中,当try块中有return语句时,finally块会在return语句执行之前执行,但return语句的返回值会在finally块执行完毕后才真正返回。

以下是代码示例:

public class FinallyWithReturnExample {
    public static int test() {
        try {
            return 1;
        } finally {
            System.out.println("finally block executed");
        }
    }

    public static void main(String[] args) {
        int result = test();
        System.out.println("Return value: " + result);
    }
}

在上述代码中,test方法的try块中有一个return 1语句。当执行到return 1时,并不会立即返回,而是先执行finally块中的代码,打印出"finally block executed",然后try块中的return 1才真正返回值1,最后在main方法中打印出返回值。

下面看一下finally块执行前后对return值影响的特殊情况:

public class FinallyModifyReturnExample {
    public static int test() {
        int num = 1;
        try {
            return num;
        } finally {
            num = 2;
            System.out.println("finally block modified num to: " + num);
        }
    }

    public static void main(String[] args) {
        int result = test();
        System.out.println("Return value: " + result);
    }
}

在这个例子中,try块中return num语句会先将num的值1保存起来,虽然在finally块中修改了num的值为2,但return语句返回的仍然是保存的1,所以最终打印的返回值是1。

再看一种情况:

public class FinallyReturnOverrideExample {
    public static int test() {
        try {
            return 1;
        } finally {
            return 2;
        }
    }

    public static void main(String[] args) {
        int result = test();
        System.out.println("Return value: " + result);
    }
}

在此例中,finally块中也有return语句,这种情况下finally块中的return会覆盖try块中的return,最终返回值为2。

总结来说,finally块会在try块中的return语句执行之前执行,但如果finally块中没有return语句,try块中的return会在finally块执行完毕后返回保存的值;如果finally块中有return语句,则会覆盖try块中的return语句返回的值。