第一句子大全,网罗天下好句子,好文章尽在本站!

java1.7 AutoCloseable接口和try-with-resources语法示例

时间:2016-12-06

AutoCloseable接口非常简单,只定义了一个close方法:public interface AutoCloseable {void close Exception;}该接口是JDK 1 7 才新增的一个接口

友情提示:本文共有 2364 个字,阅读大概需要 5 分钟。

AutoCloseable接口。

AutoCloseable接口非常简单,只定义了一个close方法:

public interface AutoCloseable {

void close() Exception;

}

该接口是JDK 1.7 才新增的一个接口,方法文档注释该方法在try-with-resources语句中会被自动调用,用于自动释放资源。

try-with-resources语句是JDK 1.7中一个新的异常处理机制,更方便简洁的关闭在try-catch语句块中使用的资源,这里不得不提及传统的资源释放方式try-catch-finally:

byte[] b = new byte[1024];

FileInputStream fis = null;

try {

fis = new FileInputStream("my.txt");

int data = fis.read();

while(data != -1) {

data = fis.read(b);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

System.out.println(new String(b));

传统的资源释放方式是利用finally语句块的特性,不管try语句块里是否抛出异常,finally语句块均会被执行,该方式存在一个较隐蔽的问题,先看下面的改造示例:

byte[] b = new byte[1024];

FileInputStream fis = null;

try {

fis = new FileInputStream("my.txt");

int data = fis.read();

while (data != -1) {

data = fis.read(b);

}

throw new RuntimeException();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

throw new RuntimeException();

} finally {

if (fis != null) {

try {

fis.close();

throw new IOException();

} catch (IOException e) {

throw new IOException();

}

}

}

System.out.println(new String(b));

本意是想捕获RuntimeException的,但是因为finally语句块的特性,抛出的IOException“抑制”了RuntimeException,外界捕获到的是IOException,不便于准确的判断问题所在。因为是根据调用栈向外抛出异常。

如果采用try-with-resources结构:

byte[] b = new byte[1024];

try(FileInputStream fis = new FileInputStream("my.txt")) {

int data = fis.read();

while (data != -1) {

data = fis.read(b);

}

}

System.out.println(new String(b));

代码非常简洁,而且FileInputStream资源会被自动关闭,且若抛出异常也是内部的确定异常。

byte[] b = new byte[1024];

try (FileInputStream fis = new FileInputStream("my.txt")) {

int data = fis.read();

while (data != -1) {

data = fis.read(b);

}

throw new RuntimeException();

}

当try-with-resources结构中抛出一个异常,同时fis被释放时也抛出一个异常,最终向外抛出是try-with-resources内部的异常,反而FileInputStream资源释放时的异常被抑制,刚好和try-catch-finally相反

若在try-with-resources结构中有多个资源需要被释放,只要实现了AutoCloseable接口,均能被自动关闭:

byte[] b = new byte[1024];

try(

FileInputStream fis = new FileInputStream("my.txt");

BufferedInputStream bis = new BufferedInputStream(fis);

) {

int data = bis.read();

while (data != -1) {

data = fis.read(b);

}

}

System.out.println(new String(b));

关闭的顺序是创建的顺序的逆序。

Closeable接口继承了AutoCloseable接口,故原有实现Closeable接口的类,均能在try-with-resources结构中使用。

也可以将自定义的类实现AutoCloseable接口,然后在try-with-resources结构中使用。

本文如果对你有帮助,请点赞收藏《java1.7 AutoCloseable接口和try-with-resources语法示例》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
Go 语言中无心插柳柳成荫的接口和无为而治的空接口

Go 语言中无心插柳柳成荫的接口和无为而治的空接口

如果你还了解编程概念中的接口概念,那么我建议你最好还是先阅读上一篇文章.详情请点击 go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?,否则的话,请自动忽略上文,继续探索 Go 语言的接口有什么不同之处.如无法自...

2023-08-10 #经典句子

放弃C语言 重新回到C语言?看看一个优秀程序员的编程之路

放弃C语言 重新回到C语言?看看一个优秀程序员的编程之路

...OO语言中的代码库倾向于发展大量复杂类型的相互依赖的接口,其中参数和返回类型是更复杂的类型,复杂性是分形的,每种类型都是根据具有参数和返回类型或更多类型的方法定义的类。复杂的返回类型。并不是说OO类型的系...

2010-05-21 #经典句子

面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

...结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map 接口和 POJO 类映射到数据库字段和记录。MyBatis 的特点那么 MyBatis 具有什么特点呢?或许我们可以从如下几个方面来描述MyBatis 中的 SQL 语句和主要业务代码分离,我们一般...

2011-04-25 #经典句子

你眼中的C语言世界

你眼中的C语言世界

...语言的预处理器有两个最为常用的功能:定义常量和包含接口文件。所谓定义常量指的就是宏定义#define了,它的好处是方便程序员进行程序的调试修改,另外也可以简化比较长的变量表示。所谓接口文件指的是#include 和#include‘...

2023-06-19 #经典句子

「Java设计模式」图文代码案例详解Java五大创建者模式 建造者 原型 (抽象)工厂 单例模式

「Java设计模式」图文代码案例详解Java五大创建者模式 建造者 原型 (抽象)工厂 单例模式

...模式以一个生产男鞋和女鞋的工厂为例:工厂类和生产者接口:男鞋和女鞋的实现类:实际调用类:输出结果:生产男鞋生产女鞋进程已结束,退出代码为 0(2)、多个工厂方法模式与典型的工厂模式对比,Factory2将每个子类实...

2015-06-03 #经典句子

大学英语课后答案公众号

大学英语课后答案公众号

...ODBCJDBC开放数据库互连(ODBC)是MICROSOFT提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言。JDBC(Java Data Base Connectivity,java数据库连接)是一种...

2014-08-03 #经典句子

人生苦短 不如学Python 这话是有原因的

人生苦短 不如学Python 这话是有原因的

...于维护。对于数据库来说,Python提供了主要的商业数据库接口,它的兼容性也特别强,有一个很广泛的标准库,跨平台,兼容性也很好。由于代码开源,可移植性也特别强。还具有可扩张性,你可以用其它语言写代码,之后用pyt...

2023-07-25 #经典句子

面向对象的语言

面向对象的语言

...在基本层次关系的不同类中共享数据和操作。总结;Go中接口的遵守不是通过像"using"这样的关键字来定义的,而是通过在类型上声明的实际方法来定义的。在Efficient Go中它将这种关系称为“如果有什么东西可以做到这一点,那么...

2017-07-18 #经典句子