JAVA中try-catch-finally执行流程理解

      在日常的JAVA开发中,我们会经常用到try-catch-finally来显示的处理程序在编译时和运行时可能会发生的异常,但是有时候会不清楚在不同情况下程序的返回值是什么,下面表述我的个人理解:

第一种情况:

private static int inc() {
        int i;
        try {
            i = 1;
            return i;
        } catch (NullPointerException e) {
            i = 2;
            return i;
        } finally {
            i = 3;
        }
    }

       运行过程: 当程序执行至i=1后,准备执行下一行return之前会将i复制到最后一个本地变量表的Slot中*,简单的理解就是程序在最后执行return之前会将需要返回的值给复制到指定的用来做返回值的位置,这里就统一叫做returnValue,此时returnValue=1。然后执行finally代码,执行x=3,最后返回returnValue=1;

注意:*表示该语句摘自《深入理解JAVA虚拟机》第188页中间段落开头。

第二种情况:

private static int inc() {
        int i;
        try {
            i = 1;
            if (i == 1) {
                throw new NullPointerException();
            }
            return i;
        } catch (NullPointerException e) {
            i = 2;
            return i;
        } finally {
            i = 3;
        }
    }

        运行过程: 当程序执行至i=1后进入if语句,然后抛出异常且被catch住,程序开始执行catch代码块,i=2,在执行下一句return i 之前,会使returnValue=2。然后执行finally代码,执行x=3,最后返回returnValue=2(此时执行的是catch中的return);

第三种情况:

private static int inc() {
        int i;
        try {
            i = 1;
            if (i == 1) {
                throw new RuntimeException();
            }
            return i;
        } catch (NullPointerException e) {
            i = 2;
            return i;
        } finally {
            i = 3;
        }
    }

        运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,finally代码块结束。由于该异常没有被catch住,程序将异常抛出给方法调用方去处理,所以代码执行结果为Exception in thread "main" java.lang.RuntimeException。

第四种情况:

private static int inc() {
        int i;
        try {
            i = 1;
            if (i == 1) {
                throw new RuntimeException();
            }
            return i;
        } catch (NullPointerException e) {
            i = 2;
            return i;
        } finally {
            i = 3;
            return i;
        }
    }
        运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,然后执行return i语句之前会使returnValue=3,最后结果为3;

        另外,由于finally代码块语句是在会在程序结束前全部执行完毕,因此如果在上面几种情况下finally代码块都有renturn i时返回值均为3;

总结:在每次执行完return语句上一行代码后均会先将返回值给赋予returnValue,最后返回时也是将returnValue返回。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值