关于finally当场去世的那些事(二)

public class APP1 {
    public static void main(String[] args) {
        int a = m();
        System.out.println(a);

    }

    private static int m() {
        try {
            int b = 1 / 0;
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return 2;
        } finally {
            return 3;
        }
    }

}

结果:输出3

1、finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行。

2、 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行)、finally语句块。
return方法会出栈,出栈之前先找有没有finally代码要执行。


3、函数必须确保有唯一返回值

说明: try中如果包含return语句则catch块和finally块中必须至少有一个含有return语句。或者try中通过throw new Exception();抛出异常,则catch与finally中至少有一个return语句。因为try块会假定其中发生异常,且try块中的代码要么顺利执行,要么抛出异常。如果只在try块中包含return语句不能保证函数有返回值(如try抛出时,return语句不会执行)。所以为了保证函数具有返回值,java强制要求原则。

4、return语句的优先级是finally最大,且try与catch块中只有两者之一的return语句会被执行。为保证函数只有一个返回值则返回优先级最大的值。

你可能感兴趣的:(折戟沉沙——面经)