zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    韦到头打印链表
    字符串替换
    二维数组中的查找
    字符串加解密
    简单密码破解
    vue中store模块化
    使用requests抓取网页内容
    PyQt中的一些小问题
    微信公众号之Token验证
    编译BOOST中的PYTHON模块
  • 原文地址:https://www.cnblogs.com/djhzzl/p/14394865.html
Copyright © 2011-2022 走看看