关于try,finally异常。finally一定会执行吗?

关于try,finally。finally一定会执行吗?

答案肯定不是。

先看一下结论:
(1)当出现在try之前就有结果返回,也就是有return时,则不会往下执行。
(2)当try之中出现异常时,会执行catch语句,然后是finally;当try中有return时,会将结果返回给finally,然后看finally中是否还有返回语句,如果有则将finally中的结果返回,finally中没有返回语句则将try中的返回语句返回。

进入正文
以案例来说明:

  1. try之前就结果返回
public class Demo01 {
    private static int test() {
        int i = 1;
        if (i == 1) {
            return i;
        }
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + test());
    }
}

结果如下:

解释:因为try之前已经return,所以程序中的方法后边就不执行了。也就是finally也不会执行。

  1. try中有异常
public class Demo02 {
    private static int test02() {
        try {
            System.out.println("执行try");
            return 1 / 0;
        } catch (Exception e) {
            System.out.println("执行catch");
            return 11;
        } finally {
            System.out.println("执行finally");
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + test02());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有异常,执行catch并将结果11返回给主线程,最后执行finally

  1. try中有返回语句
public class Demo03 {
    private static int test03() {
        int i = 0;
        try {
            System.out.println("执行try:" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + test03());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,此时i为0,++i之后为1,最后返回主线程是try中返回的i,所以主线程中的值是0。

  1. try和finally中都有返回语句
public class Demo04 {
    private static int test04() {
        try {
            System.out.println("执行try");
            return 1;
        } finally {
            System.out.println("执行finally");
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + test04());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,finally中有返回语句,则直接将其返回给主线程,所以主线程最终值为2。

  1. try和finally中都有返回语句(对第四点的深入理解)
public class Demo05 {
    private static int test05() {
        int i = 1;
        try {
            System.out.println("执行try:" + i);
            i++;
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
            return i;
        }
    }

    public static void main(String[] args) {
        System.out.println("执行main:" + test05());
    }
}

结果如下:

解释:在第四点的基础上自己可以解释了,就不啰嗦了


楠哥-------一心想为IT行业添砖加瓦,却总是面向cv编程的程序员。
  谢谢阅读,无误点赞,有误还望评论区指正。
  • 18
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值