当前位置: 首页 > news >正文

Java7,AutoClosable


Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法没有被调用产生。

准备

  • 3个异常:
class OpenException extends  Exception{} class SwingException extends  Exception{} class CloseException extends Exception{}
  • OpenDoor类

构造函数会抛出OpenException,swing()方法会抛出SwingException,close方法会抛出CloseException。

class OpenDoor implements  AutoCloseable { public OpenDoor() throws  Exception { System.out.println("The door is open." ); //throw new OpenException()  }; public void swing() throws  Exception { System.out.println("The door is becoming unhinged." ); //throw new SwingException();  public void close() throws  Exception { System.out.println("The door is closed." ); // throw new CloseException();
  }
}
  • 可执行的TryWithResources类
复制代码
public class  TryWithResources { public static void main(String[] args) throws  Exception { try ( OpenDoor door = new  OpenDoor() ) { door.swing(); } catch  (Exception e) { System.out.println("Is there a draft? " + e.getClass());//注意e.getClass()  finally  { System.out.println("I'm putting a sweater on, regardless. "
);
    }
  }
}
复制代码

运行上面的代码,如果没有抛出异常的话,输出应该是这样的:

The door is open. The door is becoming unhinged. The door is closed. I'm putting a sweater on, regardless.

三个异常目前被注释掉了,现在让我们一个个的抛出他们。

开始

  • 在'try-with-resource'初始化代码块的异常(构造函数抛出)

如果OpenDoor的构造函数抛出异常时会发生什么?close()方法是否还会被自动调用?让我们来试一下就知道了,去掉构造函数中异常代码的注释:

public OpenDoor() throws  Exception { System.out.println("The door is open." ); throw new
 OpenException();
}

代码打印的结果如下:

The door is open. Is there a draftclass  OpenException I'm putting a sweater on, regardless.

可以看到,当构造函数抛出异常时try-with-resource代码体部分的代码没有被执行。当声明资源时,如果有异常抛出,可以认为资源并未正确初始化,所以并需要释放资源。然而,需要注意的时,如果其他资源已被正确初始化,那么还是会按照声明相反的顺序调用那些资源的close()方法。

  • try-with-resource代码块中抛出的异常

如果在swing方法中抛出异常,会发生什么呢?

The door is open. The door is becoming unhinged. The door is closed. Is there a draftclass  SwingException I'm putting a sweater on, regardless.

从上面的输出我们可以了解到:

  1. OpenDoor的构造方法被调用了,第一行输出
  2. OpenDoor的swing方法也被调用了,第二行输出
  3. 抛出了SwingException
  4. close方法被调用,第四行输出
  5. 异常被catch块捕获,第五行输出
  6. 执行finally代码块,地六行输出。

只是try-with-resources代码块的标准行为,尽管会使人很困惑:什么时候会执行close方法?规则是:任何AutoCloseable对象的close方法会在任何catch块代码之前被执行。

  • 在AutoCloseable对象的close方法中抛出异常
The door is open.
The door is becoming unhinged.
The door is closed.
Is there a draft? class CloseException
I'm putting a sweater on, regardless.

我是天王盖地虎的分割线

 

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4285030.html,如需转载请自行联系原作者

相关文章:

  • Java循环练习:婚礼上的谎言
  • yum命令使用大全   软件安装
  • Linux信号
  • 云计算如何结合DevOps推动软件交付成功
  • gnome-boxes 的安装与使用
  • ETL简介
  • 前端学习笔记之观察者模式
  • LeetCode: Min Stack 最小栈 Java
  • HTTP 之 套接字
  • 使用注解属性绑定
  • Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
  • 策略模式和工厂模式的区别
  • Regsvr32.exe 用法
  • 【转】js 获取浏览器高度和宽度值(多浏览器)
  • XML注释导致VS2005崩溃
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • canvas 五子棋游戏
  • iOS 系统授权开发
  • Java读取Properties文件的六种方法
  • LeetCode29.两数相除 JavaScript
  • linux安装openssl、swoole等扩展的具体步骤
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • oschina
  • Phpstorm怎样批量删除空行?
  • Promise面试题2实现异步串行执行
  • Python爬虫--- 1.3 BS4库的解析器
  • vue 个人积累(使用工具,组件)
  • Vue2.0 实现互斥
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 搭建gitbook 和 访问权限认证
  • 免费小说阅读小程序
  • 巧用 TypeScript (一)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用Gradle第一次构建Java程序
  • 新手搭建网站的主要流程
  • Java总结 - String - 这篇请使劲喷我
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​什么是bug?bug的源头在哪里?
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (七)Knockout 创建自定义绑定
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net FrameWork总结
  • .Net Web项目创建比较不错的参考文章
  • .net6Api后台+uniapp导出Excel
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [c#基础]DataTable的Select方法
  • [C++]拼图游戏
  • [Google Guava] 2.1-不可变集合
  • [iOS]随机生成UUID通用唯一识别码