Loading...

为什么finally里面不能写return

2024-12-10

作者:Hap Tool

简述
在Java代码规范中,通常要求避免在finally代码块中写return代码,在大多公司的安全规范中也会禁止此类代码书写。具体的原因可以从下面几点来说明:

1、finally中如果有return代码,即使try和catch中有return,也会执行finally。

2、finally中的return执行完后,程序结束,导致try和catch中的return代码失效。

请记住,除非遇到try或者catch中出现死循环或者jvm宕机的极端情况,否则finally中的return代码永远会被执行。

举例

举个例子,如下代码:

package com.haptool.generate;

public class Person {

    public static void main(String[] args) {
        System.out.println(addAge(10));;
    }

    public static Integer addAge(Integer age) {
        try {
            age++;
            return age;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("run catch");
            return  0;
        } finally {
            System.out.println("run finally");
            return 10;
        }
    }

}

执行的结果如下:

run finally
10

可见最终的返回结果是10。那么如果在try中抛出异常的情况下,代码会怎么走呢?

package com.haptool.generate;

public class Person {

    public static void main(String[] args) {
        System.out.println(addAge(10));;
    }

    public static Integer addAge(Integer age) {
        try {
            age++;
            if (age == 11) {
                throw new Exception();
            }
            return age;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("run catch");
            return  0;
        } finally {
            System.out.println("run finally");
            return 10;
        }
    }

}

执行的结果如下所示:

java.lang.Exception
	at com.haptool.generate.Person.addAge(Person.java:13)
	at com.haptool.generate.Person.main(Person.java:6)
run catch
run finally
10

可以看到,我们在catch捕捉了异常并正常打印出来,但是catch中的return也并未执行,最终决定返回值的还是finally中的return值。

结论

1、finally中的return代码永远会被执行,极端情况除外。

2、我们在日常的代码规范中不可在finally中写return代码。

3、在日常的业务逻辑处理中,根据逻辑判断将返回值写到try或者catch中,在最后的finally之外进行返回,不可代码中好几处地方进行return,容易产生逻辑错误。