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 draft? class 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 draft? class 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.4byte.cn/learning/84919/java-7-xin-te-xing-zi-dong-zi-yuan-guan-li-arm-he-autoclosable-jie-kou-jiao-cheng.html

Java7,AutoClosable的更多相关文章

  1. Java7 新特性: try-with-resources

    Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 利用Try-Catch-Finally管理资源(旧的代码风格)在ja ...

  2. java7笔记

    1 switch case 增加字符串类型,原理根据字符串hashcode以及string.equal比较2 数值字面量改进 新增二进制数值字面量 0b000004,在数值中间新增下划线方便阅读200 ...

  3. Java7并发编程实战(一) 守护线程的创建和运行

    Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,J ...

  4. Java7的异常处理新特性-addSuppressed()方法等

    开发人员对异常处理的try-catch-finally语句块都比较熟悉.如果在try语句块中抛出了异常,在控制权转移到调用栈上一层代码之前,finally语句块中的语句也会执行.但是finally语句 ...

  5. JAVA7遍历文件夹

    在JAVA7中提供了新的遍历文件的方法,比原有File类的递归遍历效率要好大约30%左右. 测试结果: 测试用的File类的递归,是经过对比测试几种方法,找出相对效率较好的来和JAVA7进行测试. 1 ...

  6. Java5、Java6、Java7的新特性

    Java5 Java 5添加了8个语言特性:泛型,类型安全枚举,注解,自动装箱和拆箱,增强的循环,静态导入,可变参数,协变返回类型. 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类 ...

  7. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  8. 《Java7中 下划线的新特性》

    //Java7引入了一个新功能:程序员可以在数值中使用下画线,不管是 //整形数值,还是浮点型数值,都可以自由地使用下划线.通过下划线 //分隔,可以更直观的分辨数值中到底有多少位. public c ...

  9. java7新特性 java8新特性

    Java 7 的7个新特性 Java7语法新特性 JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm

随机推荐

  1. android流量统计

    研究过一段时间的android流量统计发个自己的总结帖 1 android有一个TrafficStats类可以直接获取 总接受流量TrafficStats.getTotalRxBytes(), 总发送 ...

  2. AIX 与Linux 中crontab 介绍

    AIX 与Linux 中crontab 用法相似,先介绍Linux 中的Crontab 用法,再后介绍AIX 与Linux 的不同之处.   一.Crontab 介绍 crontab命令的功能是在一定 ...

  3. 给第三方dll强签名

    假若我们要对第三方控件或者是其他的没有源代码的DLL文件想做类似的处理,增加强名称签名,怎么处理,是很多人都会面对的问题.     步骤: 1.首先采用反汇编工具ildasm生成中间语言. ildas ...

  4. 交叉编译strace

    下载地址:https://sourceforge.net/projects/strace/ 我下的版本是4.18, 也可以到这里下载. 下面是交叉编译用的脚本: #!/bin/bash ../conf ...

  5. AutoMapper在MVC中的运用02-Decimal转String、集合、子父类映射

    本篇AutoMapper使用场景: ※ Decimal转换成String类型 ※ 源数组转换成目标数组 ※ 源中的集合(数组)属性转换成目标中的集合(数组)属性 ※ 子类父类间的映射 Decimal转 ...

  6. ormlite 在android中 排序 条件查询

    ormlite 在android中 排序 条件查询 all = dao.queryBuilder().orderBy("Id", true).where().eq("Ty ...

  7. FEC详解三

    转自:http://blog.csdn.net/Stone_OverLooking/article/details/77752076 继续上文讲解: 3) 标准的RTP头结构如下所示: 其中第一个字节 ...

  8. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

    1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localhost ~]# uname -a Linux localhost.localdomain 3. ...

  9. LockSupport的park和unpark的基本使用,以及对线程中断的响应性

    LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Loc ...

  10. Java内存数据库-H2介绍及实例(SpringBoot)

    介绍 内存数据库(Embedded database或in-momery database)具有配置简单.启动速度快.尤其是其可测试性等优点,使其成为开发过程中非常有用的轻量级数据库.在spring中 ...