java7新特性之Try-with-resources (TWR)
java7新特性之Try-with-resources (TWR)
made it much less easy to implement than originally hoped. The basic idea is to allow
a resource (for example, a file or something a bit like one) to be scoped to a block in
such a way that the resource is automatically closed when control exits the block.
This is an important change, for the simple reason that virtually no one gets manual resource closing 100 percent right. Until recently, even the reference how-tos from Sun were wrong. The proposal submitted to Project Coin for this change
includes the astounding claim that two-thirds of the uses of close() in the JDK had
bugs in them!
Fortunately, compilers can be made to produce exactly the sort of pedantic, boilerplate code that humans so often get wrong, and that’s the approach taken by this change.
This is a big help in writing error-free code. To see just how helpful, consider how
you’d write a block of code that reads from a stream coming from a URL (url) and
writes to a file (out) with Java 6. Here’s one possible solution.
Murphy’s Law applies—anything can go wrong at any time:
■ The InputStream can fail to open from the URL, to read from it, or to close
properly.
■ The File corresponding to the OutputStream can fail to open, to write to it, or
to close properly.
■ A problem can arise from some combination of more than one factor.
This last possibility is where a lot of the headaches come from—a combination of
exceptions is very difficult to deal with well.
This is the main reason for preferring the new syntax—it’s much less error-prone.
The compiler isn’t susceptible to the mistakes that every developer will make when trying to write this type of code manually.
Let’s look at the Java 7 code for performing the same task as listing 1.3. As before, url
is a URL object that points at the entity you want to download, and file is a File object
where you want to save what you’re downloading. Here’s what this looks like in Java 7.
try (OutputStream out = new FileOutputStream(file);
InputStream is = url.openStream() ) {
byte[] buf = new byte[4096];
int len;
while ((len = is.read(buf)) > 0) {
out.write(buf, 0, len);
}
}
This basic form shows the new syntax for a block with automatic management—the
try with the resource in round brackets. For C# programmers, this is probably a bit
reminiscent of a using clause, and that’s a good conceptual starting point when working with this new feature. The resources are used by the block, and they’re automatically disposed of when you’re done with them.
You still have to be careful with try-with-resources, as there are cases where a
resource might still not be closed. For example, the following code would not close its
FileInputStream properly if there was an error creating the ObjectInputStream
from the file (someFile.bin).
try ( ObjectInputStream in = new ObjectInputStream(new
FileInputStream("someFile.bin")) ) {
...
}
Let’s assume that the file (someFile.bin) exists, but it might not be an ObjectInput
file, so the file might not open correctly. Therefore, the ObjectInputStream wouldn’t
be constructed and the FileInputStream wouldn’t be closed!
The correct way to ensure that try-with-resources always works for you is to split the
resources into separate variables.
try ( FileInputStream fin = new FileInputStream("someFile.bin");
ObjectInputStream in = new ObjectInputStream(fin) ) {
...
}
One other aspect of TWR is the appearance of enhanced stack traces and suppressed
exceptions. Prior to Java 7, exception information could be swallowed when handling
resources. This possibility also exists with TWR, so the stack traces have been enhanced
to allow you to see the type information of exceptions that would otherwise be lost.
For example, consider this snippet, in which a null InputStream is returned from
a method:
try(InputStream i = getNullStream()) {
i.available();
}
This will give rise to an enhanced stack trace, in which the suppressed NullPointerException (NPE for short) can be seen:
at wgjd.ch01.ScratchSuprExcep.run(ScratchSuprExcep.java:23)
at wgjd.ch01.ScratchSuprExcep.main(ScratchSuprExcep.java:39)
Suppressed: java.lang.NullPointerException
at wgjd.ch01.ScratchSuprExcep.run(ScratchSuprExcep.java:24)
1 more
We encourage you to use try-with-resources as soon as you’re able, to eliminate unnecessary bugs from your codebase.
TWR and AutoCloseable
Under the hood, the TWR feature is achieved by the introduction of a new interface,
called AutoCloseable, which a class must implement in order to be able to appear
as a resource in the new TWR try clause. Many of the Java 7 platform classes have
been converted to implement AutoCloseable (and it has been made a superinterface of Closeable), but you should be aware that not every aspect of the platform
has yet adopted this new technology. It’s included as part of JDBC 4.1, though.
For your own code, you should definitely use TWR whenever you need to work with
resources. It will help you avoid bugs in your exception handling.
Well-Grounded Java Develope
java7新特性之Try-with-resources (TWR)的更多相关文章
- java7新特性之Diamond syntax
java7新特性之Diamond syntax Java 7 also introduces a change that means less typing for you when dealing ...
- java7新特性 java8新特性
Java 7 的7个新特性 Java7语法新特性 JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm
- Java7 新特性 数值文本表示法
今天和大家分享下 java7中新特性-数值文本表示法 首先,在原来jdk1.6中 如果需要将一个二进制的数值转换成十进制的话,一般情况下都会以下面的代码方式去实现. public static voi ...
- java7 新特性 总结版
Java7语法新特性: 前言,这是大部分的特性,但还有一些没有写进去,比如多核 并行计算的支持加强 fork join 框架:这方面并没有真正写过和了解.也就不写进来了. 1. switch中增加对S ...
- Java7新特性
① 新增了switch对字符串的支持,也就是说可以在switch之后直接使用字符串来进行判断,语法基本与Java7之前支持的语法一样. ② 对数值字面量的增强支持,首先是可以在源代码中直接使用二进制数 ...
- Java7 新特性: try-with-resources
Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 利用Try-Catch-Finally管理资源(旧的代码风格)在ja ...
- Java7 新特性 —— java.nio.file 文件操作
本文部分摘自 On Java 8 自 Java7 开始,Java 终于简化了文件读写的基本操作,新增了 java.nio.file 库,通过与 Java8 新增的 stream 结合可以使得文件操作变 ...
- Java7 新特性 switch 可以使用String
今天和大家分享下 在java7中可以使用String 作为switch 中的参数. 原来在java7之前,switch只能去接收一个 byte.char.short.int 类型 现在在java7中 ...
- Java7新特性(一)Coin
1.语法糖 数字下划线 2.switch语句中的String 3.multicatch 4.final重抛 对比上份代码 5.try-with-resources(TWR) AutoC ...
随机推荐
- incremental linking(增量链接)的作用
转:incremental linking(增量链接)的作用 今天编译一个C++程序时,报了一个奇怪的错误(之前是好好的): 1>LINK : fatal error LNK1123: fail ...
- C++11新特性之final override标识符
final: final修饰符可用于修饰类,放在类名后面,被final修饰符修饰的类不能被继承.示例代码: // 正确的示范 #include <iostream> class A { p ...
- 秋招复习-C++( 一)
Linux/Unix编程部分 1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket 2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种 ...
- Codeforces450 B. Jzzhu and Sequences
B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 自媒体人Chrome浏览器必备插件精选神器!
自从互联网时代起,浏览器使用从最早的IE,到opera,到猎豹浏览器,到360双核浏览器,到火狐,到safari,到目前最喜欢用的chrome.一路下来,chrome的稳定性与扩展性征服了我,成了我必 ...
- 用python爬取一张仓鼠图片
一. 找到一张仓鼠图片并复制一下它的url url='http://img.go007.com/2017/08/16/c407f5b732f4e748_2.jpg' 二. 调用urllib库 impo ...
- Python面向对象之类属性类方法静态方法
类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...
- PHP 真值与空值
本文参考 http://php.net/manual/en/types.comparisons.php. 1. isset bool isset ( mixed $var [, mixed $... ...
- 集训第四周(高效算法设计)N题 (二分查找优化题)
原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度 ...
- UVa 10129 单词 (欧拉通路)
题意: 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如acm.malform.mouse).每个单词最 多包含100 ...