文章目录

  • 关于try..catch中的finally子句
  • 1、在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。
  • 2、finally语句通常使用在哪些情况下呢?
  • 3、try和finally,也可以没有catch
  • 4、退出JVM,finally语句不执行
  • 关于finally的一道面试题


关于try…catch中的finally子句

1、在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。

  • finally子句必须和try一起出现,不能单独编写。

2、finally语句通常使用在哪些情况下呢?

通常在finally语句块中完成资源的释放/关闭
因为finally中的代码比较有保障
即使try语句块中的代码出现异常,finally中的代码也会正常执行

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

public class ExceptionText3 {
    public static void main(String[] args) {
        FileInputStream fis = null;//声明位置放到try外面,这样在finally中才能用
        try{
            //创建输入流对象
            fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\学习.txt");
            //开始读文件...

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

            //流使用完需要关闭,因为流是占用资源的
            //即使以上程序出现异常,流也必须要关闭
            //放在这里有可能流关不了
            //fis.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }catch(NullPointerException e){
            e.printStackTrace();
        }finally {
            System.out.println("hello 浩克");
            //流的关闭放在这里比较保险
            //finally中的代码是一定会执行的
            //即使try中出现了异常!
            if(fis != null) {//避免空指针异常
                try {
                    //close方法有异常采用捕捉的方式
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

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

fis.close未被注释前:

java synchronized关键字 java关键字finally_java


修改后:

java synchronized关键字 java关键字finally_System_02

3、try和finally,也可以没有catch

  • try不能单独使用。
  • try 可以和finally联合使用。

以下代码的执行顺序:

先执行try…
再执行finally
最后执行return(return语句只要执行方法必然结束)

public class ExceptionText4 {
    public static void main(String[] args) {
        try {
            System.out.println("try...");
            return;
        }finally {
            //finally中的语句会执行。能执行到。
            System.out.println("finally...");
        }

        //这里不能写语句,因为这个代码是无法执行到的。
        //System.out.println("Helloword");
    }
}

运行结果:

java synchronized关键字 java关键字finally_java_03

4、退出JVM,finally语句不执行

public class ExceptionText5 {
    public static void main(String[] args) {
        try {
            System.out.println("try..");
            //退出JVM
            System.exit(0);//退出JVM之后,finally语句中的代码就不执行了!
        }finally {
            System.out.println("finally..");
        }
    }
}

运行结果:

java synchronized关键字 java关键字finally_java_04

关于finally的一道面试题

public class ExceptionText5 {
    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++;
        }
    }
}

最后的结果为 100

java synchronized关键字 java关键字finally_java_05


解释: Java语法中有这样一条规则:

  • 方法体中的代码必须遵循自上而下顺序依次逐行执行(亘古不变的语法!)

Java中还有一条语法规则:

  • return语句一但执行,整个方法必须结束(亘古不变的语法!)

反编译之后的结果:

public static int m(){
	int i = 100;
	int j = i;
	i++;
	return j;
	Exception exception;
	exception;
	i++;
	throws exception;	
}