博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java7,AutoClosable
阅读量:6508 次
发布时间:2019-06-24

本文共 2387 字,大约阅读时间需要 7 分钟。

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 CloseExceptionI'm putting a sweater on, regardless.

我是天王盖地虎的分割线

 

 

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

你可能感兴趣的文章
ECSHOP添加购物车加图片飞入效果
查看>>
谈谈SQL 语句的优化技术
查看>>
Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]
查看>>
数据结构Java实现04----循环链表、仿真链表
查看>>
ecshop如何判断缓存文件是否能更新
查看>>
打印xls注意事项
查看>>
Linq左关联 右关联 内关联
查看>>
电脑知识--实用文章
查看>>
Android新建项目 默认布局改为 LinearLayout
查看>>
SQL Server 事务处理 回滚事务
查看>>
android usb挂载分析---MountService启动
查看>>
ZH奶酪:PHP的cURL库
查看>>
【 D3.js 入门系列 --- 3 】 做一个简单的图表!
查看>>
mybatis0208 缓存
查看>>
svn回退到具体的版本
查看>>
全栈JavaScript路(八)得知 CDATASection 种类 节点
查看>>
JSP模板文本
查看>>
javascript于boolean类型转换,运营商&&和|| 返回值
查看>>
iOS远程推送之友盟Push
查看>>
Socket tips: UDP Echo service - Client code
查看>>