try-catch-finally执行顺序的探索(建议采用调试)

## try-catch-finally执行顺序的探索(建议采用调试)

1.try{ }块中捕捉到异常执行顺序

try中的return不会执行---》跳到catch块中执行,执行其中的return语句,但是不会跳出去--》继续执行finally中语句并在其中的return语句返回

package com.xurong.test;

/**
 * @auther xu
 * @date 2022/3/22 - 20:48
 */
public class test {
    public static void main(String[] args) {
        
        int a = WithException();
        System.out.println(a);
    }
    public static int WithException(){

        int i=10;

        try{

            System.out.println("i in try block is : "+i);

            i = i/0;//产生异常

            return --i;

        }

        catch(Exception e){

            System.out.println("i in catch - form try block is : "+i);

            --i;

            System.out.println("i in catch block is : "+i);

            return --i;

        }

        finally{

            System.out.println("i in finally - from try or catch block is--"+i);

            --i;

            System.out.println("i in finally block is--"+i);

            return --i;

        }

    }

}




i in try block is : 10
i in catch - form try block is : 10
i in catch block is : 9
i in finally - from try or catch block is--8
i in finally block is--7
6

2.try{ }块中没有捕捉到异常执行顺序

执行try{ }块中的return,将执行的return值保存在栈中---》没有异常产生,不会执行catch()中的语句--》执行finally内容

package com.xurong.test;

/**
 * @auther xu
 * @date 2022/3/22 - 20:48
 */
public class test {
    public static void main(String[] args) {

        int a = WithException();
        System.out.println(a);
    }
    public static int WithException(){

        int i=10;

        try{

            System.out.println("i in try block is : "+i);

            i = i/1;//没有产生异常

            return --i;

        }

        catch(Exception e){

            System.out.println("i in catch - form try block is : "+i);

            --i;

            System.out.println("i in catch block is : "+i);

            return --i;

        }

        finally{

            System.out.println("i in finally - from try or catch block is--"+i);

            --i;

            System.out.println("i in finally block is--"+i);

            return --i;

        }

    }

}




i in try block is : 10
i in finally - from try or catch block is--9
i in finally block is--8
7

结论一:

return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)

结论二:

finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。

补充:

规则:
1.try块是必须的,catch块和finally块都是可选的,但必须存在一个或都存在。try块不能单独存在。
2.try块里的语句运行中出现异常会跳过try块里其他语句,直接运行catch里的语句。
3.无论try块中是否有异常,无论catch块中的语句是否实现,都会执行finally块里的语句。
4.只有一种办法不执行finally块里的语句,那就是调用System.exit(1);方法,即退出java虚拟机。

参考:

[https://www.nowcoder.com/profile/168268554/test/54165848/44594#summary]:

posted @ 2022-03-23 22:49  远道而重任  阅读(27)  评论(0编辑  收藏  举报