try catch finally return各种执行顺序的排列组合

情况1:try{}catch{}finally{}return

public int try_catch_finally() {
		int i=0;
		try{
			System.out.println("enter try");
		    i+=11;
		    //i/=0;
		}catch (Exception e){
			System.out.println("enter catch");
		    i+=12;
		}finally {
			System.out.println("enter finally");
			i+=13;
		}
		System.out.println("enter return");
		return i;
	}

无异常:

enter try
enter finally
enter return
24

有异常(取消i除以0的注释):

enter try
enter catch
enter finally
enter return
36

情况2:try{return}catch{}finally{}return

public int try_catch_finally() {
		int i=0;
		try{
			System.out.println("enter try");
		    i+=11;
		    //i/=0;
			return i;
		}catch (Exception e){
			System.out.println("enter catch");
		    i+=12;
		    //return i;
		}finally {
			System.out.println("enter finally");
			i+=13;
		}
		System.out.println("enter return");
		return i;
	}

无异常:虽然执行了finally块,但返回的是try块中return语句之前的代码的执行结果,不受finally块影响

enter try
enter finally
11

有异常(取消i除以0的注释):

enter try
enter catch
enter finally
enter return
36

情况3:try{}catch{return}finally{}return

public int try_catch_finally() {
		int i=0;
		try{
			System.out.println("enter try");
		    i+=11;
		    //i/=0;
		}catch (Exception e){
			System.out.println("enter catch");
		    i+=12;
		    return i;
		}finally {
			System.out.println("enter finally");
			i+=13;
		}
		System.out.println("enter return");
		return i;
	}

无异常:

enter try
enter finally
enter return
24

有异常(取消i除以0的注释):与情况2类似,虽然执行了finally块中代码但返回的仍是catch块中return语句之前的代码的执行结果

enter try
enter catch
enter finally
23

情况4:try{(return)}catch{(return)}finally{return}

把return写到finally块中,则一定在finally块中返回,不用管try块和catch块中的return,程序按顺序执行。

情况5:try{return}catch{}return

public int try_catch_finally() {
		int i=0;
		try{
			System.out.println("enter try");
		    i+=11;
		    //i/=0;
		    return i;
		}catch (Exception e){
			System.out.println("enter catch");
		    i+=12;
		}
		System.out.println("enter return");
		return i;
	}

无异常:

enter try
11

有异常(取消i除以0的注释):

enter try
enter catch
enter return
23

情况6:try{}catch{return}return

public int try_catch_finally() {
		int i=0;
		try{
			System.out.println("enter try");
		    i+=11;
		    //i/=0;
		}catch (Exception e){
			System.out.println("enter catch");
		    i+=12;
		    return i;
		}
		System.out.println("enter return");
		return i;
	}

无异常:

enter try
enter return
11

有异常(取消i除以0的注释):

enter try
enter catch
23

情况7:try{return}catch{}finally{}

    public void test() {
        try {
            if (RandomUtil.randomInt(0, 2) == 1) {
                log.info("if");
                return;
            }
            log.info("else");
        } finally {
        	// 必定触发
            log.info("finally");
        }
    }
if
finallyelse
finally

其他:try{return}catch{return}finally{}return

在这里插入图片描述
原因:参考情况2,try和catch都有return的情况下,执行完finally块中内容就会返回。还有类似的不可达情况,就不一一列举了,清楚原理就可以应对。

如果本文对你有所帮助,希望可以点个赞。

如果发现本文有错误,欢迎在评论区指出。

参考:https://www.zhihu.com/question/20805826/answer/83665792

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值