欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java语言中finally是否一定会执行你知道吗,

来源: javaer 分享于  点击 3734 次 点评:210

Java语言中finally是否一定会执行你知道吗,


目录
  • 简介
  • finally 代码块不会运行的情况
    • 情况一:代码流程并未进入try语句块
    • 情况二: 使用了 System.exit(int) 退出程序
    • 情况三:程序所在的线程死亡
    • 情况四:其它非正常退出
  • 总结

    简介

    我们都知道,finally 作为异常处理的一部分,它只能紧跟在try/catch语句后,附带一个语句块,表示这段语句,“在正常情况下”,最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。那么在我们的应用在运行中,一定会运行finally代码块吗?其实不是的,有以下几种情况我们的finally代码块是不会运行的。

    finally 代码块不会运行的情况

    情况一:代码流程并未进入try语句块

    这也是最好理解的情况,如果代码流程不进入try代码块,则相应的catch和finally代码块自然不会执行。

    	public static void main(String[] args) {
            int i = 0;
            System.out.println("enter main block");
            boolean flag = false;
            if (flag) {
                try {
                    System.out.println("enter try block");
                    i = i / i;
                } catch (Exception e) {
                    System.out.println("enter catch block");
                }finally {
                    System.out.println("enter finally block");
                }
            }
        }
    

    运行结果为:

    enter main block

    情况二: 使用了 System.exit(int) 退出程序

    在进入try或catch块后,使用了 System.exit(int) 退出程序。

    	public static void main(String[] args) {
            int i = 0;
            System.out.println("enter main block");
            try {
                System.out.println("enter try block");
                System.exit(0);
                i = i / i;
            } catch (Exception e) {
                System.out.println("enter catch block");
            } finally {
                System.out.println("enter finally block");
            }
        }
    

    public static void main(String[] args) {
            int i = 0;
            System.out.println("enter main block");
            try {
                System.out.println("enter try block");
                i = i / i;
            } catch (Exception e) {
                System.exit(0);
                System.out.println("enter catch block");
            } finally {
                System.out.println("enter finally block");
            }
        }
    

    运行结果为:

    enter main block
    enter try block

    但是呢,如果 System.exit(int) 在try代码块异常语句之后, finally 还是会被执行,因为已经没有机会执行 System.exit(int) ,程序已经退出了,比如:

    	public static void main(String[] args) {
            int i = 0;
            System.out.println("enter main block");
            try {
                System.out.println("enter try block");
                i = i / i;
                System.exit(0);
            } catch (Exception e) {
                System.out.println("enter catch block");
            } finally {
                System.out.println("enter finally block");
            }
        }
    

    运行结果为:

    enter main block
    enter try block
    enter catch block
    enter finally block

    情况三:程序所在的线程死亡

    在当前线程死亡的情况下,finally里的语句也不会执行,比如干扰中断,或者程序外部kill该线程,或者是意外中止。

    	public static void main(String[] args) {
            int i = 0;
            System.out.println("enter main block");
            try {
                System.out.println("enter try block");
                // 模拟执行任务10s,然后在执行任务过程中杀死该线程
                Thread.sleep(10 * 1000);
                i = i / i;
            } catch (Exception e) {
                System.out.println("enter catch block");
            } finally {
                System.out.println("enter finally block");
            }
        }
    

    这里在休眠里,用kill命令,杀死该线程,模拟非正常退出,最后运行结果为:

    enter main block
    enter try block

    这里值得注意的是,我们常常在try语句块里获取了一些临界资源,然后finally语句块里释放该资源。此时,如果正常获得取资源后,程序非正常中断,则我们并未正常释放该资源,就会导致资源可能会被无限占用,所以这里要考虑一下其它的解决方法,比如给资源设置一个使用时间等,到期自动收回。

    情况四:其它非正常退出

    还有其它非正常退出(道理同上,就不演示了),也会导致finally代码块不执行,比如物理关闭电源,关闭 CPU等。这些其实在开发生产环境中是常有出现的,比如在开发中,某一台服务器获取锁后,不小心断电或宕机了(未成功释放锁),然后导致别的机器也不能获得到锁(如果锁无时间限制),最终导致出现系统型的问题。完事以后,你们开发也不知道发生了什么事,就把所有服务都重启了一次,解决了问题,最后说一句:“啊!还是重启大法好”。

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注3672js教程的更多内容! 

    您可能感兴趣的文章:
    • Java全面细致讲解final的使用
    • Java零基础也看得懂的单例模式与final及抽象类和接口详解
    • Java中关键字final finally finalize的区别介绍
    • 从内存模型中了解Java final的全部细节
    • Java中final关键字和final的4种用法
    • Java内存模型final的内存语义
    • 深入理解java final不可变性
    • Java超详细分析讲解final关键字的用法
    相关栏目:

    用户点评