try...catch...finally到底的执行过程

        最近做题的时候遇到过两次 try-catch 这类的问题,全做错了,好嘛,不愧是我,也是醉了。

        下面就那其中一题来好好说道说道 try-catch-finally 的整个执行过程。

package algorithms.com.guan.javajicu;
public class TestDemo{
    public static String output = "";
    public static void foo(int i){
        try{
            if (i == 1){
                throw new Exception();
            }
        }
        catch (Exception e){
            output += "2";
            return ;
        } finally{
            output += "3";
        }
        output += "4";
    }
    public static void main(String[] args){
        foo(0);
        foo(1);
        System.out.println(output);
    }
}

        问这段代码最后输出的是什么?

        我们先来看代码吧,代码也很简单,就是main方法里面调用foo方法,而foo方法里面用到了我们今天这篇文章的主角 try-catch-finally 。

        首先啊我们要知道 finally{} 中的代码不管你有没有抛出异常都会被执行,因此在运行 foo(0) 时,先判断 i 是否等于1,这里很明显不是,所以不会抛出异常,也就不会执行 catch{} 语句,继续往下走会执行 finally{} 中的代码,这时候 output == “3”。

        然后继续往下走,这里要注意一下,执行 finally{} 中的代码后,后面的代码还是会执行的,不是直接就结束当前方法(因为我原来就是这样认为的,当然也有执行 finally{} 中的代码后,后面的代码不会执行的情况,等等我会在下面讲到),执行语句 output += "4"; 这个时候 output == “34”,到此 foo(0) 这行代码执行完毕。

        接下来执行 foo(1),首先我们也是先判断i 是否等于1,很明显这里是的,所以会抛出异常,这个时候 cath{} 语句就发挥出了它的作用,捕获到了异常,并且执行语句 output += "2"; 执行完成之后此时 output == "342" 。

        然后准备执行 return; 结束foo方法,但因为有 finally{} 中的代码,因此还会继续执行 finally{} 中的代码,也就是会执行语句 output += "3"; 执行完成之后就会退出foo方法(这里就是执行 finally{} 中的代码后,后面的代码不会执行的情况,因为 catch 语句有 return),此时 output == “3423”。

        所以最后这段代码的输出为:3423

        这里扩展一下,如果在 finally{} 语句的最后一行加上 return; 会怎么样呢?有兴趣的话可以自己去试试看,下面附上答案:

        

        怎么样,是不是和你想的一模一样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值