try、catch、finally、return执行过程

try、catch、finally、return执行过程

try、finally、return、jdk1.8

本文提到的点均经测试,本文最后贴一下测试代码,如需再次验证,自行注释个别行即可。

基本认识

  1. 在一个方法中,发生异常后,程序停止,剩余逻辑不会执行;
  2. 使用try后,下方可用一个或若干catch捕获各类型的异常,若未捕获,程序仍会在异常处停止;
  3. 使用try-catch捕获异常后,try内异常后逻辑不会执行,try-catch-finally后的方法逻辑会继续执行;
  4. 一般情况下,不管是否发生任何异常,finally都一定会执行(在不一般的非异常情况下有个例外,下面会写);
  5. 一般情况下的执行流程,try前逻辑》try逻辑》(若发生异常,其适配的catch逻辑》)finally逻辑。

特别说明

  1. catch捕获异常类型从上到下依次匹配,匹配到即执行该catch,后续异常类型不会继续匹配,所以需要将特别处理的子异常类型写在前面,最后可以用Exception兜底;
  2. 不论何处使用System.exit(0);都会直接退出虚拟机,因而此后所有逻辑都不会再执行,包括 try、finally、try-catch-finally后逻辑、调用处等;
  3. 若try和catch中执行了return语句,finally仍然会执行;
  4. try或catch中有return时,finally在return语句计算之后,返回前执行,这里计算是已经计算出最终的返回结果,不管finally如何修改其变量,都不会改变之前计算的结果;
  5. finally中若有return,那么程序将在此返回,且会用finally中的return表达式结果,覆盖先前try-catch中的结果值;
  6. 如果在try-catch中均有return或在finally中有必然执行的return,那么该方法内try-catch-finally之后就不能再出现任何语句,否则编译不通过。

重申第2点,不管在何时,只要出现该语句,程序都会直接停止。

对于第四条,对于基本类型或个别返回值,finally不会对其产生影响,但例如ListMap等,是可以在finally中修改其属性或元素内容的(对象自身仍然没有改变)。
这篇博文提到,date类型也不会被finally影响,由于其未提及是哪个包,故未验证。

最后贴一下测试代码,开头的注解参考Java轻量级测试框架,其参数无实义,重点在代码。

class Solution {
    @AssertExample(params = "1", expectResult = "0")
    public int hammingWeight(int n) {
        int ans = 0;
        System.out.println("开始喽开始喽,主调方法开始喽");
        System.out.println(test("诶嘿嘿"));
        System.out.println("方法还执行的吗");
        return ans;
    }

    public String test(String p) {
        System.out.println("这参数啥档次?" + p);
        String ans = "这可是test返回值哦~";
        try {
            System.out.println("try try try!");
//            System.exit(0);
//            if (!"".equals(p)) {
            if ("".equals(p)) {
                throw new RuntimeException("干啥呢你?");
            }
            System.out.println("哎?好像没发生什么异常啊");
            ans = "来看看,try返回了个啥东西?";
            return ans += "try整点东西到返回结果来";
        } catch (Exception e) {
            System.out.println("异常拿下啦");
            ans = "catch,也能返回?";
            return ans += "catch来给返回结果整点活";
        } finally {
            ans += "最终执行一下final";
            System.out.println(ans);
            return ans += "final 也给返回结果整活了";
        }
//        return "哦耶,被调方法总算执行完了"; // try、catch都返回了这里就不能有返回了
    }
}

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值