Java try finally return 解惑


#Java 笔记


若可以走到 finally 里的 return ,则以该 return 为准

示例:

public class Main {

    public static void main(String[] args) {

        System.out.println(getNumber(false));
        System.out.println(getNumber(true));

    }

    public static int getNumber(boolean flag) {

        try {
            if (flag) {
                throw new RuntimeException("...");
            }
            return 1;
        } catch (Exception ex) {
            return 2;
        } finally {
            return 3;
        }

    }
}

结果:

3
3

若出了 finally 之后,还有 return,则以实际运行时走到的return为准

示例:

public class Main {

    public static void main(String[] args) {

        System.out.println(getNumber(false));

    }

    public static int getNumber(boolean flag) {

        try {
            if (flag) {
                throw new RuntimeException("...");
            }
        } finally {
            return 1;
        }
        return 2;
    }
}

编译会报错:

$ javac Main.java
Main.java:18: 错误: 无法访问的语句
        return 2;
        ^
1 个错误

可以通过加个判断语句绕过这个语法检查。见下面的示例:

public class Main {

    public static void main(String[] args) {

        System.out.println(getNumber(false));
        System.out.println(getNumber(true));

    }

    public static int getNumber(boolean flag) {

        try {
            if (flag) {
                throw new RuntimeException("...");
            }
        } finally {
            if (flag) {
                return 1;
            }
        }
        return 2;
    }
}

运行结果:

2
1


( 本文完 )