Java异常机制之try catch finally return执行顺序

Backdround

实验室的大师姐突然问窝很详细的Java异常代码块的执行顺序,一下子被问蒙了,写了个测试代码,顺手放上来充数(其实不是,就是不想写托福,不学习怎么都快乐)

什么时候不执行finally

  1. try 或catch语句中执行了退出虚拟机的方法(即System.exit(0))
  2. 执行finally之前jvm崩了
  3. 执行finally之前电脑崩了

final执行的终极原则

没有异常finally也要跑

你懂的,不管有没有异常,final这位小火鸡都会运行

code:懒得写

return或throw前finally执行

try或catch的代码块里时遇到return或throw语句时,finally仍然会执行,反而系统并不会立即执行return或throw这两个语句,而是会去执行final,如果没有finally块,程序才会立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用再跳回去执行try块、catch块里的任何代码。

当finally块里也使用了return语句,弱智代码如下:

public class Main {
    public static void main(String[] args) {
        System.out.println("normal operation in main function");
        System.out.println(testException());
    }

    private static String testException(){
        try {
            System.out.println("normal operation in try block");
            return "TRY";
        }finally {
            System.out.println("normal operation in final block");
            return "finally";
        }
    }
}

运行结果:
在这里插入图片描述

当finally块里没有return语句:
在这里插入图片描述

返回值与finally的不解之谜

finally里没有return时

finally里没有return时,函数返回值是在finally执行前确定的,你猜猜下面这段代码结果是啥

public class Main {
    public static void main(String[] args) {
        System.out.println("normal operation in main function");
        System.out.println(testException());
    }

    private static String testException(){
        String retStr;
        try {
            retStr = "TRY";
            System.out.println("normal operation in try block");
            return retStr;
        }finally {
            retStr = "finally";
            System.out.println("normal operation in final block");
        }
    }
}

运行结果可能会出乎你的意料
在这里插入图片描述
不要慌,程序没问题,此处涉及到一些jvm机制,详情咱有空再说,可以参考这个博客:Java进阶–Java中 i++完全解析

finally里有return时

finally里有return时,程序会提前退出,而且返回值不是try或catch中保存的返回值,而是finally里面的return语句,其实应该就是return这句其实并不是我们臆想中的简单顺序执行代码,详情可以查看对应代码的字节码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值