Java-finally相关问题

Java中 final,finally,finalize区别

final

  • 是Java 中的修饰符。final 修饰的类不能被继承,修饰的方法不能被重写,修饰的变量初始化之后不能被修改。(不是绝对的,可以使用别的手段修改)

  • 一个类被声明为final,这意味着这个类不能再派生新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract 抽象类,又被声明为 final 。

  • 变量或方法被声明为final , 可以保证他们在使用中不被改变。声明为final 的变量必须在声明时给定初值,以后的引用中只能读取,不可修改。被声明为final 的方法同样只能使用,不能重写。

finally

  • finally:Java 异常处理的组成部分,finally 代码块中的代码一定会执行,常用于释放资源。

  • 在异常处理时提供finally块来执行相应操作。如果抛出一个异常,那么相匹配的catch语句就会被执行,然后控制就会进入finally块。

finalize

  • finalize:Object 类中的一个方法,垃圾收集器删除对象之前会调用这个对象的 finalize()方法。

  • finalize是方法名,Java允许使用finalize()方法,在垃圾收集器中将对象从内存中清除之前之前做必要的清理工作。这个方法是在垃圾收集器已经确定,被清理对象没有被引用的情况下调用的。

  • finalize是在Object类这难搞定义的,因此,所有的类都机场塔。子类可以覆盖finalize()方法来整理系统资源或者执行其他清理工作。


finally块中的代码执行问题

问题:如果执行finally代码块之前返回了结果,或者JVM退出,这时finally块中的代码还会被执行吗

答:Java程序中的finally代码块并不一定会被执行,以下情况finally代码块不会执行。


1.try语句没有被执行到。
即没有进入try代码块,对应的finally自然不会被执行。

比如在异常处理之前程序已经返回。看下面代码,分别输入true和false

public class Test1 {
    public static boolean test_finally(boolean i ){
        if (i == true){
            System.out.println("if");
            return true;
        }
        try {
            i = true;
            return true;
        }finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args){
        test_finally(false);
        System.out.println("-------------");
        test_finally(true);
        /**
         * 输出:
         * finally
         * -------------
         * if
         */
    }
}

第一个执行finally了,第二个没有,return后直接不执行finally代码块。


在执行异常处理代码块之前,程序已经停止抛出异常。比如在刚刚代码前加上异常。

    public static boolean test_finally(boolean i ){
        int j = 1/0 ; // Exception in thread "main" java.lang.ArithmeticException: / by zero

        if (i == true){
            System.out.println("if");
            return true;
        }
        try {
            i = true;
            return true;
        }finally {
            System.out.println("finally");
        }
    }

直接报错抛出异常,不执行finally块。


2.在try-catch块中有System.exit(0) 操作来退出JVM

System.exit(0)用于终止正在运行的JVM,会强制退出程序,这样finally块中的代码就不会执行了。

public class Test2 {
    public static void test_finally(){
        try {
            System.out.println("try");
           System.exit(0);
        }finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args) {
        test_finally();
        /**
         * 输出:
         * try
         */
    }
}

可以看到没有执行finally代码块,参数0代表程序正常退出,非0代表非正常退出。


总结:

在finally相对应的try语句得到执行的情况下,finally才可能执行,如果在finally执行前,程序或线程停止,finally不会执行。


我的csdn:https://blog.csdn.net/weixin_45910779/article/details/113750545

posted @ 2021-02-10 02:55  秃头不用洗发水  阅读(225)  评论(0编辑  收藏  举报