return 与try catch finally 执行顺序以及在try中使用锁踩过的坑

6 篇文章 0 订阅
本文详细探讨了Java中try-catch-finally语句的执行顺序,尤其是在递归调用和涉及锁管理的场景下,强调了finally块的重要性以及开发中注意代码细节的重要性。
摘要由CSDN通过智能技术生成

@[TOC] return 与try catch finally 执行顺序以及踩过的坑

1. try catch finally 的执行顺序

  1. 情形一:先执行try代码块里面的语句,如果try语句代码块里面的代码没有报错,则执行完try语句之后执行finally代码块的内容

public static void main(String[] args) {

        try {
            System.out.println("我是try语句");
        }catch(RuntimeException e){
            System.out.println("我是catch语句");
        }finally {
            System.out.println("我是finally语句");
        }

    }

运行截图如下

运行截图

  1. 情形二:先执行try代码块里面的语句,如果try语句代码块里面的代码报错抛出异常则会被catch捕获,如果抛出的异常是catch捕获的异常或者其子类,则进入catch语句,在执行完成之后执行finally代码块的内容
public static void main(String[] args) {

        try {
            System.out.println("我是try语句");
            throw new NullPointerException();
        }catch(RuntimeException e){
            System.out.println("我是catch语句");
        }finally {
            System.out.println("我是finally语句");
        }

    }
  

运行截图如下

运行截图

  1. 情形三:先执行try代码块里面的语句,如果try语句代码块里面的代码报错抛出异常则会被catch捕获,如果抛出的异常不是catch捕获的异常或者其子类,则不会进入catch语句,直接执行finally代码块的内容
public static void main(String[] args) {

        try {
            System.out.println("我是try语句");
            throw new NullPointerException();
        }catch(ClassCastException e){
            System.out.println("我是catch语句");
        }finally {
            System.out.println("我是finally语句");
        }

    }

运行截图如下
运行截图

1.1 总结

综合上诉内容可以发现,finally的内容始终都会执行

2. 当try catch finally遇到return

在项目中,有一个需要重试的业务场景,大致就是如果遇到程序运行遇到问题需要进行重试,最多重试5次

代码demo如下

public static void main(String[] args) {
        test(0);
    }

    public static  void test(int num){
        try {
            System.out.println(num);
            if(num < 5){
                num++;
                test(num);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("我进入finally, 我的num是" + num );
        }

    }

运行截图如下

运行截图

这是一个递归调用,当我们进入if条件判断的时候会再次进入到test方法当中,相当于try语句里面的内容还在执行,只有num>=5的时候try语句执行完成,然后一层一层的输出,这样也是没有问题。
当时当我们在try语句里面的业务需要加锁完成,在finally中释放锁的时候就会出现问题,因为我们在try语句里面进行重试但是锁并没有被释放掉,因为没有进入finally中去,所以就会造成再次重试拿不到锁的情况。所以需要我们再重试之前手动去释放一下锁。
当时在开发的时候忽略了这个问题,造成了执行业务特别耗时。

2.1 总结

在开发过程中,每一行代码都应该在自己深思熟虑之后再写,不然出现了问题想要解决是一件很耗时的事情

万丈高楼平地起,一砖一瓦皆根基

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值