在java重新认识TryCatch

        敲过代码的同志们都知道,在程序中处理异常我们常用Try  Catch结构的代码来接收,处理异常,那么我们是否真的已经了解了try catch了呢?


一、问题的提出


        在去面试的时候面试官曾经问过我这样的问题,如果我在try的方法体中写了一个return,在catch中写了一个return,在finaly中也写了一个return,问如果没有异常是哪个return触发,如果有异常是哪个return触发?当时就懵了,感觉似曾相识的问题竟然还可以这么问,然后再开发ITOO的晨会上,组长也明确了,异常的接收和处理的过程是不能有多个return作为出口的,要做到单入单出,这样才能让我们的程序更加规范。所以很有必要深入研究一下。

        请看下面的例子,用到了try catch的一些实现。


二、验证


        做验证么,我们就要有一个程序作为铺垫在模拟这个过程,首先我在service层定义了一个方法,用来被调用,他会输出字符或者抛出异常。

    public String testTry(String asd) throws Exception {
        throw new Exception("抛出");
    }

        然后在facade层写了一个方法用来接收处理异常:

public String testTry(String asd){
        try {
            return teachSecretariesCurriculumScheduleService.testTry(asd) + asd+"正常";
        }catch(Exception e){
            return asd+"catch";
        }finally {
            return asd + "finally";
        }
}


        最后写一个测试用的方法来调用:

    @Test
    public void testTry()
    {
        String asd="结果为:";
        String Result = teachSecretariesCurriculumFacade.testTry(asd);
        System.out.println(Result);
    }

      
      我们运行这个结果,可以看到最后系统输出为

                      结果为:finally

      我们可以见到出现异常的时候通常是走finally里面的return的,如果我们把finally删除之后会如何呢?

                      结果为:catch

     这里可以说明,异常被catch了,走了catch里面的return方法。这样就可以说明了在出现异常并且catch和finally都有return的时候,只走finally的return。


      我们再来看一下,如果不返回异常,而是返回一个确定值的话会怎么样呢?

      改造service层的代码,facade有finally的情况:

    public String testTry(String asd) throws Exception {
        return "true";
    }
        然后再看我们的程序,运行会发现结果为:

                       结果为:finally

        我们可以看到在没有报异常的情况下,还是会走finally下的return,而不是走try下面的return。如果我们去掉finally会怎么样呢?

                       结果为:true

         这说明什么呢,说明了去掉了finally之后我们的程序直接走的try下面的return方法,这个说明了finally存在的含义就是必须执行,所以程序会自动屏蔽除了finally之外的步骤里面的return语句(如果有的话),但是非return语句是不受影响的,我们可以在try,catch,finally后面加上system.out.println("try/catch/finally")  然后我们输出可以看到相应的结果,这里不再举例。


三、总结


        总的来说,try/catch语句的原则还是以finally为重的,当每个段内都有return的这种只能执行一次的代码的时候,编译器会自动屏蔽掉除了finally之外的阶段里面的return语句的执行,但是其他的代码并不会,所以如果写了try/catch的语句,并且用了多个return,那么,不用担心,因为系统只会执行一个return语句,只是你知不知道他走的是哪一个的问题把了,还有你的小伙伴能不能理解你写的代码的意思了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值