关于异常处理语句catch和finally的执行先后顺序

来源:互联网 发布:人工智能 电影在线 编辑:程序博客网 时间:2024/05/16 08:40

刚刚看到try  catch  finally语句,多思考了一下,发现他们的执行顺序心里还有点模糊,


所以特地测试了一下,以下是测试结果总结:


1. 当catch中没有return返回语句是,try  catch  finally是按从上到下的顺序依次执行!


代码:

public static void main(String[] args) {
        int[] arr = { 1, 2, 3 };
        System.out.println(arr[2]);
        try {
            System.out.println(2 / 0);
        } catch (ArithmeticException ae) {
            System.out.println("系统正在维护,请与管理员联系!");
        } finally {
            System.out.println("catch成功!");
        }
    }


执行结果---->:

 3
系统正在维护,请与管理员联系!
catch成功!


2. 当catch中有return语句时,执行结果是先执行catch中的内容,当执行到return的时候,先去执行finally中的内容,最后执行return语句。


代码:

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


    public static String test() {
        int[] arr = { 1, 2, 3 };
        System.out.println(arr[2]);
        try {
            System.out.println(2 / 0);
        } catch (ArithmeticException ae) {
            System.out.println("系统正在维护,请与管理员联系!");
            return "myTest";
        } finally {
            System.out.println("catch成功!");
        }
        return null;
    }


执行结果---->:

3
系统正在维护,请与管理员联系!
catch成功!
myTest


3. 当catch和finally中都有return字句时,finally中的return字句会覆盖catch中的return返回值.


代码:

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


    public static String test() {
        int[] arr = { 1, 2, 3 };
        System.out.println(arr[2]);
        try {
            System.out.println(2 / 0);
        } catch (ArithmeticException ae) {
            System.out.println("系统正在维护,请与管理员联系!");
            return "myTest";
        } finally {
            System.out.println("catch成功!");
            return "myfinally";
        }
    }


执行结果---->:

3
系统正在维护,请与管理员联系!
catch成功!
myfinally


4. 当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为基本类型,Date类型时,在finally中修改返回值的值时,不影响catch中return的返回值结果):


代码:

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


    public static String test() {
        int[] arr = { 1, 2, 3 };
        String a = "2";
        System.out.println(arr[2]);
        try {
            System.out.println(2 / 0);
        } catch (ArithmeticException ae) {
            System.out.println("系统正在维护,请与管理员联系!");
            return a;
        } finally {
            System.out.println("catch成功!");
            a = "ccccc";
        }
        return "";
    }


执行结果---->:

3
系统正在维护,请与管理员联系!
catch成功!
2


5.  即上面第4点的特殊点:

当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为list,map,数组时,在finally中修改返回值的值时,会影响catch中return的返回值结果):


代码:

public static void main(String[] args) {
        int[] arr = { 1, 2, 3 };
        System.out.println(Test.test(arr)[2]);
    }


    public static int[] test(int[] arr) {


        System.out.println(arr[2]);
        try {
            System.out.println(2 / 0);
        } catch (ArithmeticException ae) {
            System.out.println("系统正在维护,请与管理员联系!");
            return arr;
        } finally {
            System.out.println("catch成功!");
            arr[2] = 5;
        }
        return null;
    }


执行结果---->:

3
系统正在维护,请与管理员联系!
catch成功!
5


其中list,map我在这里就没贴代码了,已经通过了测试,各位有兴趣可以自己动手试试!


以上,仅供参考!!













0 0
原创粉丝点击