码迷,mamicode.com
首页 > 其他好文 > 详细

final、finally、finalize的区别

时间:2021-04-22 16:08:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:避免   数据   some   void   double   无法   退出   input   指针   

初识finally

  • finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。
  • finally子句必须和try一起出现,不能单独使用。执行顺序:try→finally→return。
  • finally应用场景。
    • 通常在finally语句块中完成资源的释放/关闭。
  • 要是真的不想执行到finally,可以在try里面加入:System.exit(0);,表示退出JVM,那样就执行不到finally了。

实例:

package com.bjpowernode.javase.Exception0;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ExceptionTest10 {
    public static void main(String[] args) {
        FileInputStream fis = null; // 声明位置放到try外面。这样在finally中才能用。
        try {
            // 创建输入流对象
            fis = new FileInputStream("E:\\三个表数据表.txt");
            // 开始读文件....

            String s = null;	// 这里一定会出现空指针异常!
            s.toString();
            System.out.println("hello world!");

            // 既然有输入流,那用完就需要关闭。放在这里要是上面出现异常,流关不了了。
            //fis.close();
        } catch (FileNotFoundException e) { //FileInputStream的异常:FileNotFoundException
            e.printStackTrace();
        } catch(IOException e){     //close的异常:IOException
            e.printStackTrace();
        } catch(NullPointerException e) {   //这个是null的空指针异常;属于运行时异常,可catch可不catch
            e.printStackTrace();
        } finally {
            System.out.println("hello 浩克!");
            if (fis != null) { // 判断一下是否有输入流,避免空指针异常!
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println("hello kitty!");

    }
}
拓展:面试题。

Java中恒古不变的语法:

  • 方法体中的代码必须遵循自上而下顺序依次逐行执行。
  • return语句一旦执行,整个方法必须结束。
  • finally也一定要执行。(情境:下面代码)

实例:

package com.bjpowernode.javase.Exception0;

//分析:返回的结果为什么是100呢?
//必须满足上面的三条语法规则,那看起来有些矛盾。
//所以,反编译看一下:先执行i=100,将i=100赋给j,再执行finally里的i++,最后返回j。那么先执行i=100,满足语法;再执行i++,看似跳过了return,不符合语法,但是前面i已经赋值给j了,后面return j,相当于在前面就return i了,因为return j的结果是在i=100之后,并没有进行任何操作。
public class ExceptionTest13 {
    public static void main(String[] args) {
        int result = m();
        System.out.println(result); //100
    }

    public static int m(){
        int i = 100;    
        try {
            // 这行代码出现在int i = 100;的下面,所以最终结果必须是返回100
            // return语句还必须保证是最后执行的。一旦执行,整个方法结束。
            return i;
        } finally {
            i++;
        }
    }
}

/*
反编译之后的效果
public static int m(){
    int i = 100;
    int j = i;
    i++;
    return j;
}
 */


final、finally、finalize的区别

  • final 关键字
    • final修饰的类无法继承
    • final修饰的方法无法覆盖
    • final修饰的变量不能重新赋值。
  • finally 关键字
    • 和try一起联合使用。
    • finally语句块中的代码是必须执行的。
  • finalize 标识符
    • 是一个Object类中的方法名。
    • 这个方法是由垃圾回收器GC负责调用的。

实例:

package com.bjpowernode.javase.exception;

public class ExceptionTest14 {
    public static void main(String[] args) {

        // final是一个关键字。表示最终的。不变的。
        final int i = 100;
        //i = 200;

        // finally也是一个关键字,和try联合使用,使用在异常处理机制中
        // 在fianlly语句块中的代码是一定会执行的。
        try {

        } finally {
            System.out.println("finally....");
        }

        // finalize()是Object类中的一个方法。作为方法名出现。
        // 所以finalize是标识符。
        // finalize()方法是JVM的GC垃圾回收器负责调用。
        Object obj;
    }
}

// final修饰的类无法继承
final class A {
    // 常量。
    public static final double MATH_PI = 3.1415926;
}

class B {
    // final修饰的方法无法覆盖
    public final void doSome(){

    }
}

final、finally、finalize的区别

标签:避免   数据   some   void   double   无法   退出   input   指针   

原文地址:https://www.cnblogs.com/LFR-21/p/14686902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!