@[TOC] return 与try catch finally 执行顺序以及踩过的坑
1. try catch finally 的执行顺序
- 情形一:先执行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语句");
}
}
运行截图如下
- 情形二:先执行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语句");
}
}
运行截图如下
- 情形三:先执行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 总结
在开发过程中,每一行代码都应该在自己深思熟虑之后再写,不然出现了问题想要解决是一件很耗时的事情
万丈高楼平地起,一砖一瓦皆根基