关于Finally块的执行顺序

背景为了保证一定能回收try块里打开的物理资源,异常处理机制提供了finally块

Java异常处理机制:

1.当try语句块内容执行出错,系统会自动生成一个异常对象,将该异常对象交给JRE,这就是我们所说的抛出(throw)异常

2.jre拿到异常对象,去catch块找匹配的异常对象类型,将异常对象传给catch块的形参,交给catch块做异常处理,这就是我们所说的捕获(catch)异常

3.当程序执行try或者catch块时遇到return或者throw语句时,不会立即执行,而是去找是否有finally块,如果有,,系统立即开始执行finally块,只有当finally执行完成之后,系统才会跳回来执行try或catch语句里的return或throw语句,如果finally块里有return或throw语句等导致方法终止的语句,finally已经终止了方法,系统不会再跳回try或catch块执行代码。

tip:捕获异常catch块、先捕获小异常,在捕获大异常

示例一:

//下面是新建一个测试类的main方法
public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("a.txt");//读不存在的文件内容到输入流,系统创建文件不存在异常对象-抛出异常
        } catch (FileNotFoundException e) {//找到匹配异常对象类型的catch块,将异常对象传给e-捕获异常
            System.out.println(e.getMessage());//开始进行异常处理-打印异常的详细描述信息
            e.printStackTrace();//输出异常的跟踪栈信息
      //      System.exit(0);// 先不说它
            return ;//遇到人return先不执行,去找finally块
        } catch (IOException ie) {
            System.out.println(ie.getMessage());
        }finally{//一定会被执行的代码块(并不一定),通常用来关闭物流资源-数据库连接、网络连接、磁盘文件io流
            if(fis !=null){//判断输入流对象存在
                try {
                    fis.close();//关闭输入流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("执行finally块里的资源回收");
            //finally块执行完回到catch块继续执行return语句
        }
    }

示例二:

public static void main(String[] args) {
        boolean a = test();//所以返回结果是false
        System.out.println(a);//false
    }

//定义一个静态方法,static修饰为了main调用
public static boolean test(){
    try {
       // System.exit(0);//说finally并不一定执行是因为,如果运行这行代码,直接退出虚拟机,那么finally就不会执行了
        return true;//遇到return去执行finally块
    }finally{
        return false;//有return直接方法结束,不会再跳转try执行return
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值