三道经典异常处理代码题

57 阅读1分钟

题目1

publicclass TryDemo {

    public static void main(String[] args) {

        System.out.println(test());

    }

    public static int test() {

        try {

            return1;

        } catch (Exception e) {

            return2;

        } finally {

            System.out.print("3");

        }

    }

}

执行结果:31。

try、catch。finally 的基础用法,在 return 前会先执行 finally 语句块,所以是先输出 finally 里的 3,再输出 return 的 1。

题目2

publicclass TryDemo {

    public static void main(String[] args) {

        System.out.println(test1());

    }

    public static int test1() {

        try {

            return2;

        } finally {

            return3;

        }

    }

}

执行结果:3。

try 返回前先执行 finally,结果 finally 里不按套路出牌,直接 return 了,自然也就走不到 try 里面的 return 了。
finally 里面使用 return 仅存在于面试题中,实际开发这么写要挨吊的。

题目3

publicclass TryDemo {

    public static void main(String[] args) {

        System.out.println(test1());

    }

    public static int test1() {

        int i = 0;

        try {

            i = 2;

            return i;

        } finally {

            i = 3;

        }

    }

}

执行结果:2.

大家可能会以为结果应该是 3,因为在 return 前会执行 finally,而 i 在 finally 中被修改为 3 了,那最终返回 i 不是应该为 3 吗?
但其实,在执行 finally 之前,JVM 会先将 i 的结果暂存起来,然后 finally 执行完毕后,会返回之前暂存的结果,而不是返回 i,所以即使 i 已经被修改为 3,最终返回的还是之前暂存起来的结果 2。