Java之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未被注释前:
在这里插入图片描述
修改后:
在这里插入图片描述

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");
    }
}

运行结果:
在这里插入图片描述

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..");
        }
    }
}

运行结果:
在这里插入图片描述

关于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语法中有这样一条规则:

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

Java中还有一条语法规则:

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

反编译之后的结果:

public static int m(){
	int i = 100;
	int j = i;
	i++;
	return j;
	Exception exception;
	exception;
	i++;
	throws exception;	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值