try-catch-finally的情况分类

先说结论:

1.不论try 或者catch中有没有return,finally中的代码都会执行

2.不论try或者catch中有没有return,只要finally中有return,那么他们里面的return语句都不执行,只执行finally中的return

3.不论哪个return执行,都会在最后执行,也就是说,符合语法的代码都会执行完才会执行return

4.return执行的优先级: finally中的return>try中的==catch中的>finally之后的return

以下是验证

情况一

//情况一 try{} catch(){}finally{}, 当三个里面都没有return
// 正常执行时,顺序是:try中的代码,然后是finally中的代码,因为没有抛出异常,所以catch中的代码并不会执行;
// 非正常执行:也就是try中出现了异常 ,顺序是try中出现异常的地方之前的代码执行,然后是catch中代码执行,再然后是finally中的代码执行,try其余的代码不会执行
public class demo01 {
    public static void main(String[] args) {
        int i=1;
        try {
            System.out.println(i);
            System.out.println(i/0);
            System.out.println("hahahah");

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
        }
        finally {
            System.out.println("我是finally");
        }


    }
}

情况二

package test_2021_1_6.try_catch_finally;
//情况二 try{ return; }catch(){} finally{} return;
//正常执行:程序执行try块中return之前(包括return语句中的表达式运算,如我写的 i+2 已经计算出了应该返回3,但是还没有返回)代码,而是执行再执行finally块,最后执行try中return;
//finally块之后的语句return,因为程序在try中已经return所以不再执行。
//非正常执行:抛出了异常:  还是从try中开始,但是从出现异常代码语句开始后面的语句都不在执行,在这里也就是System.out.println(i/0);之后代码都不执行,跳到catch中,执行完代码,接着执行finally代码,然后执行最后的return
public class demo02 {
    public static void main(String[] args) {
        //System.out.println(method01());
        System.out.println(method02());

    }
//不会出现异常
    public static int method01() {
        int i=1;
        try {
            i++;


            System.out.println("111111111111111111");
            return i+5;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
        }
        finally {
            System.out.println("我是finally");
        }
        return i;
    }
//会出现异常
    public static int method02() {
        int i=1;
        try {
            i++;
            System.out.println(i/0);
            System.out.println("222222222222222");
            return i+6;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
        }
        finally {
            System.out.println("我是finally");
        }
        return i;
    }

}

情况三

/*
情况三   try{ } catch(){return;} finally{} return;


 */
public class demo03 {
    public static void main(String[] args) {
       // System.out.println(method01());
        System.out.println(method02());

    }
    //正常执行的情况下,catch中的语句不会执行,finally后的return执行
    public static int method01() {
        int i=1;
        try {
            i++;


            System.out.println("111111111111111111");


        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+5;
        }
        finally {
            System.out.println("我是finally");
        }
        return i;
    }
    //会出现异常,try中的异常前的的代码--》catch中return前的代码-》finally中的代码---》catch中的return ,finally后的return不执行
    public static int method02() {
        int i=1;
        try {
            i++;
            System.out.println(i/0);
            System.out.println("222222222222222");

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+6;
        }
        finally {
            System.out.println("我是finally");
        }
        return i;
    }
}

情况四

/*
   情况四 try{ return; }catch(){} finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。
 */
public class demo04 {
    public static void main(String[] args) {
      //  System.out.println(method01());
        System.out.println(method02());

    }
    //不会出现异常    ,当try和finally都有return时,执行finally的,try中的不执行
    public static int method01() {
        int i=1;
        try {

            System.out.println("111111111111111111");
            return i+5;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
        }
        finally {
            System.out.println("我是finally");
            return i+1;
        }

    }
    //会出现异常,那么try后面的代码都不会执行,finally中的return执行
    public static int method02() {
        int i=1;
        try {

            System.out.println(i/0);
            System.out.println("222222222222222");
            return i+6;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
        }
        finally {
            System.out.println("我是finally");
            return 5;
        }

    }
}

情况五

/*
try{} catch(){return;}finally{return;}

程序执行catch块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。
 */
public class demo05 {
    public static void main(String[] args) {
        //System.out.println(method01());
        System.out.println(method02());
    }
    //不会出现异常
    public static int method01() {
        int i=1;
        try {
            i++;


            System.out.println("111111111111111111");


        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+5;
        }
        finally {
            System.out.println("我是finally");
            return i;
        }

    }
    //会出现异常
    public static int method02() {
        int i=1;
        try {
            i++;
            System.out.println(i/0);
            System.out.println("222222222222222");

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+6;
        }
        finally {
            System.out.println("我是finally");
            return i;
        }

    }
}

情况六

/*
try{ return;}catch(){return;} finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;

则再执行finally块,因为finally块中有return所以提前退出。

无异常:则再执行finally块,因为finally块中有return所以提前退出。
 */
public class demo06 {
    public static void main(String[] args) {

    }
    public static int method01() {
        int i=1;
        try {
            i++;


            System.out.println("111111111111111111");
            return i+1;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+2;
        }
        finally {
            System.out.println("我是finally");
            return i+3;
        }

    }
    //会出现异常
    public static int method02() {
        int i=1;
        try {
            i++;
            System.out.println(i/0);
            System.out.println("222222222222222");
            return i+1;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("出异常了");
            return i+2;
        }
        finally {
            System.out.println("我是finally");
            return i+3;
        }

    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值