考你几个try-catch-finally相关问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/conconbenben/article/details/102733930

这几个问题可以更加了解try-catch-finally。

1.

public class TestTryCatchFinally {
    public static void main(String[] args) {
        System.out.println(getA());
    }

    public static int getA() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;
            /*
             * return a 在程序执行到这一步的时候
             * 这里不是return a 而是 return 3;这个返回路径就形成了
             * 但是,它发现后面还有finally
             * 所以继续执行finally的内容
             * a=4 再次回到以前的路径,继续走return 3,
             * 形成返回路径之后,这里的a就不是a变量了,而是常量3
             */
        } finally {
            a = 4;
        }
        // 这里return a;也不会影响返回结果,因为在catch中已经返回
        return 0;
    }
}

运行结果:3

2.

public class TestTryCatchFinally {
    public static void main(String[] args) {
        System.out.println(getA());
    }

    @SuppressWarnings("finally")
    public static int getA() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;

        } finally {
            a = 4;
            // 如果这样,就又重新形成了一条返回路径
            // 由于只能通过1个return返回,所以这里直接返回4
            return a;
        }
    }
}

运行结果:4

3.

public class TestTryCatchFinally {
    public static void main(String[] args) {
        System.out.println(getA());
    }

    public static int getA() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
        } finally {
            a = 4;
        }
        return a;// 这样只有一个回路,按照赋值先后顺序,最后的赋值为答案
    }
}

运行结果:4

4

public class TestTryCatchFinally {
    public static void main(String[] args) {
        System.out.println(getA());
    }

    public static int getA() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
            System.out.println("a=2");
        } catch (ArithmeticException e) {
            a = 3;
            System.out.println("a=3");
            // 系统程序退出后不会进行finally流程。
            System.exit(0);
        } finally {
            a = 4;
            System.out.println("a=4");
        }
        System.out.println("a=" + a);
        return a;
    }
}

5.

class A {
    public static void main(String[] args) {
        method();
    }
​
    static void method() {
        try {
            System.out.println("Hello");
        } finally {
            System.out.println("World");
        }
    }
}

编译运行后,输出结果是()。(选择一项) 
a)  Hello 
b)  World
c)  Hello
     World 
d) 代码不能编译

答案:c 

解析:好多人认为try-catch语句是放在一起不能省略的。其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。有如下三种:

try-catchtry-finallytry-catch-finally

切记:catch和finally语句不能同时省略!!!

小结:
a、不管有没有出现异常,finally块中代码都会执行;
b、当try和catch中有return时,finally仍然会执行;
c、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
d、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
e、try-catch-finally流程在执行finally分支前如果系统进程退出(System.exit)或被kill掉,finally分支将不会被执行。
f、try-catch-finally catch和finally语句不能同时省略!!!

猜你喜欢

转载自blog.csdn.net/conconbenben/article/details/102733930
今日推荐