【JAVA】finally 一定会被执行吗?

finally一定会执行吗?

答案:肯定不是。

第一种情况:程序未执行到 finally 块。

1.在执行 try 块之前直接 return,finally 块是不会执行的。

public class Test {
    private static int total() {
        int i = 11;
        if (i == 11) {
            return i;
        }
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }
    public static void main(String[] args) {
        System.out.println(">>>>>>>输出结果:" + total());
    }
}

2.在执行 try 块之前程序直接报错,那么finally块自然就不会执行到了。

public class Test {
    private static int total() {
        return 1/0;
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }
    public static void main(String[] args) {
        System.out.println(">>>>>>>输出结果:" + total());
    }
}

3.在执行try块时,主动退出jvm。

public class Test {
    private static int total() {
        try {
            System.exit(0);
        }catch(Exception e){ 
            System.out.println("执行catch");
        }finally {
            System.out.println("执行finally");
        }
        return 0;
    }
    public static void main(String[] args) {
        System.out.println(">>>>>>>输出结果:" + total());
    }
}

第二种情况:程序执行到 finally 块。

1.finally 块不含返回值。

预想的结果应该是1,结果返回了0。这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。

public class TryCatchTest {
    private static int total() {
        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(">>>>>>>>>输入结果:" + total());
    }
}

 2.finally 块含返回值。

预想的结果应该是1,结果也确实返回了1。

public class TryCatchTest {
    private static int total() {
        int i = 0;
        try {
            System.out.println("执行try:" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
            return i;
        }
    }
    public static void main(String[] args) {
        System.out.println(">>>>>>>>>输入结果:" + total());
    }
}

或者

public class TryCatchTest {
    private static int total() {
        int i = 0;
        try {
            System.out.println("执行try:" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally:" + i);
        }
        return i;
    }
    public static void main(String[] args) {
        System.out.println(">>>>>>>>>输入结果:" + total());
    }
}


在分析含有finally块的方法返回值时,要对于return出现的地方进行具体分析。在finally块中进行return操作的话,则方法整体的返回值就是finally块中的return返回值。如果在finally块之后的方法内return,则return的值就是进行完上面的操作后的return值。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值