今天学习JDBC的时候查看了接口Statement的executeQuery()方法的时候偶然发现了一个新的接口:

看到红笔圈出的那句话当时没反应过来,才知道是接口的多继承,但是后面的那个接口并没有见过;

然后再网上找答案的时候突然找到了关于AutoCloseable的用法顾名思义就是自动关闭的意思,这里我给大家贴出有关它的讲解,感觉自己受益匪浅啊,最近在学jdbc学完就开始去找工作了;

自动化资源管理(即ARM)能力是Java 7特有的,目前使用Java 6的朋友在编译时很多库都需要重新编译以适应Java 6的需要。其目的在于当遇到错误或是成功执行完代码块后能够轻松处理好外部资源。

  Project Coin的一个突出特点就是具备了自动化资源管理(即ARM)能力,这个能力是Java 7特有的,目前使用Java 6的朋友在编译时很多库都需要重新编译以适应Java 6的需要。其目的在于当遇到错误或是成功执行完代码块后能够轻松处理好外部资源。其最初实现位于Open JDK中。考虑如下繁琐的文件拷贝操作,代码来自于Java Bytestream教程:[code]FileInputStream in = null;

  FileOutputStream out = null;

  try {

  in = new FileInputStream("xanadu.txt");

  out = new FileOutputStream("outagain.txt");

  int c;

  while ((c = in.read()) != -1)

  out.write(c);

  } finally {

  if (in != null)

  in.close();

  if (out != null)

  out.close();

  }[/code] 上面不仅有大量的样版代码,而且InputStream.close()的文档表明它会抛出IOException(OutputStream也存在类似的异常,无论何种情况,要想成功编译这些代码,要么在外面加上catch块,要么将异常继续往外抛)。

  try-catch-finally块的语义范围还要求变量FileInputStream in与FileOutputStream out声明在块的外面(如果定义在try块内,那么catch块与finally块就访问不到了)。

  为了减少上面这些样版代码并且收紧块中所用的资源范围,Java语言在try块中新增了一些内容。最初的try-with-resources块(或者叫做ARM块)规范已经拥有实现了,随后该规范被纳入到JDK 7 build 105中。

  新的接口java.lang.AutoCloseable被加到了提案API中,它只定义了一个会抛出Exception的方法close()。该接口是java.io.Closeable的父接口,这意味着所有的InputStream与OutputStream都会自动享受到该行为所带来的好处。此外,FileLock与ImageInputStream也实现了AutoCloseable接口。

  这样,上面的代码就可以这样来写:[code]try (

  FileInputStream in = new FileInputStream("xanadu.txt");

  FileOutputStream out = new FileOutputStream("outagain.txt")

  ) {

  int c;

  while((c=in.read()) != -1 )

  out.write();

  }[/code]在try块的末尾,无论是正常结束还是抛出了异常,out与in资源都会自动调用close()方法。此外,与之前示例不同的是out.close()与in.close()保证会执行(在之前的示例中,一旦in.close()方法抛出了异常,随后的out.close()方法就没有机会执行了)。

  关于这种方式,还有一些微妙之处值得我们注意:

  ◆如上代码所示,在资源部分中,最后一个资源后面是不允许使用分号的。

  ◆资源块使用()分隔,而不是常见的{},以此将其与现有的try块分隔开来。如果存在资源块,那么里面必须要包含一个或多个资源定义语句。

  ◆每个资源定义具有如下形式:type var = expression;在资源块中不能使用通常的语句。

  ◆资源都是隐式final的,也就是说即便没有使用final,这些资源也都是final的。如果尝试为资源变量赋值会得到一个编译期错误。

  ◆资源必须是AutoCloseable的子类型,如果不是的话会得到一个编译期错误。

  ◆资源关闭的顺序与定义的顺序正好相反。换句话说,在上面的代码示例中,out.close()要先于in.close()得到调用。这么做可以构建嵌套的流,然后从外向内关闭流,这要比按顺序关闭更好(也就是说,可以在底层的流关闭前先清空缓存)。

  ◆每个块可以生成n+1个异常,n是资源的数量。这出现在代码主体抛出了异常,然后每个资源关闭语句也都抛出异常的情况下。在这种情况下,代码主体的异常将被抛出,但其他的异常将会被添加到异常的抑制列表(suppressed exception list)中。可以通过getSuppressedExceptions()方法访问这些异常信息。

  ◆异常堆栈追踪信息可以带有Suppressed前缀:在这些情况下,序列化的Throwable格式也有所不同(如果Java 6客户端调用了远程Java 7运行时中的服务会出现这个问题,反之亦然)。

  ◆javax.swing与java.sql目前并不会加入到ARM中;类需要继承AutoCloseable才能为ARM所用。JDBC 4.1如果能够成为JDK 7的一部分,那么它也将支持ARM,但具体时间尚未确定。

  能够移除Java开发者每天都要编写的样版代码对生产力的提升是个促进,虽然JDK 7具备了这种能力,但有时需要在编写代码前利用这种能力。很多库都需要重新编译以适应Java 6的需要,无论何时,只要使用了自动化资源管理,那么它就只能用于使用-target 7编译的代码。等到Java 6寿终正寝,并且Java 8发布后,使用ARM就会成为自然而然的事情了。

AutoCloseable的用法相关推荐

  1. try()...catch()的用法

    前面小括号中出现问题,文件流会自动关闭 摘自网友回复: 在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类 ...

  2. Java笔记-异常机制中try(...)中括号的用法

    今天在看到某位Java大佬这样的写法,也让大家一起来观摩下: 这里可以看到,将某些变量,和流放到了括号里面,在后面的代码中,也没有finally,也没见将其释放. 经过查阅资料,发现,在java7后有 ...

  3. java try 的用法_java try(){}catch(){}自动释放资源及用法

    java语言中try(){}catch(){}的用法介绍.介绍了通常的try-catch的用法以及 try-with-resources 的用法. 1.try{} catch(){}的用法 通常try ...

  4. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  5. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  6. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  7. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  8. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  9. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

最新文章

  1. Forcepoint DLP解决方案持续推高各机构的业务发展进程
  2. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8712和8732E电磁流量计变送器的功能规格...
  3. 芯片巨头英特尔放弃竞争迷你计算机市场
  4. jquery:TypeError: $(...).on is not a function
  5. 电脑内存16g和32g,有什么区别?
  6. @苹果,iOS App 还需要多久才能运行在 Mac 上?
  7. 消息已读未读的模型设计_构建一个即时消息应用(三):对话 | Linux 中国
  8. Android 学习 笔记_07. XML文件解析
  9. mysql 中国省份城市数据库表
  10. 用Geek Uninstaller在win10下卸载office2010
  11. 一对一视频直播源码|手机视频直播平台android源码/可打包视频直播
  12. C语言 随机起名和记录
  13. java发送outlook_在Outlook 2007中发送民意调查
  14. C4D 21版 安装好一打开就闪退,查了好久
  15. 微博点击图片放大html,新浪微博图片放大效果[artZoom.js]
  16. SSH访问Amazon EC2实例时权限被拒绝(publickey)[关闭]
  17. Mentor-dft 学习笔记 day12-Multi-Mode ChainsScan Insertion Flows
  18. 输入一行字符,统计其中有多少个单词,单词间用空格分隔(C语言)
  19. 干货:Easy系列各视频平台云台控制功能的使用注意事项汇总
  20. java网络爬虫0基础_简单的java爬虫程序(入门)

热门文章

  1. matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
  2. 三十四、深入Vue.js语法(中篇)
  3. keras从入门到放弃(三)逻辑回归 softmax
  4. 不再内卷!视觉字幕化新任务合集
  5. ICML 2020 | Google提出最强生成式摘要预训练模型——天马
  6. 【百度飞浆】RCNN系列目标检测算法详解
  7. show attend and tell代码实现(绝对详细)
  8. micropython中文社区 socket通讯_基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)...
  9. time库python_Python的time库的一些简单函数以及用法
  10. 云服务器Linux jdk安装详解(centos8)