try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。任何实现了java.lang.AutoCloseable接口的对象,和实现了java.io.Closeable接口的对象,都可以当做资源使用。

下面是使用样例

1.申明两个实现AutoCloseable接口的类

package jdk7_new_character;

public class AutoCloseableTestClass implements AutoCloseable {

    @Override
public void close() throws Exception {
System.out.println("autoclose AutoCloseableTestClass");
} }
package jdk7_new_character;

public class AutoCloseableTestClass2 implements AutoCloseable {

    @Override
public void close() throws Exception {
System.out.println("autoclose AutoCloseableTestClass2"); } }

2.测试

package jdk7_new_character;

public class Test {

    @org.junit.Test
public void test() {
// fail("Not yet implemented");
} @org.junit.Test
public void testAutoClose() {
System.out.println("begin testAutoClose");
/*
* try { AutoCloseableTestClass autoCloseableTestClass = new
* AutoCloseableTestClass(); } catch (Exception e) { } finally {
*
* }
*/ try (AutoCloseableTestClass autoCloseableTestClass = new AutoCloseableTestClass();
AutoCloseableTestClass2 autoCloseableTestClass2 = new AutoCloseableTestClass2()
) {
System.out.println("try{}");
} catch (Exception e) {
e.printStackTrace();
} System.out.println("over testAutoClose");
} }

3.运行结果

可以看到你可以在一个try-with-resources语句里面声明多个资源。当代码块中代码终止,不管是正常还是异常,对象的close方法都会自动按声明的相反顺序调用。

注意:try-with-resources语句也可以像普通的try语句一样,有catch和finally代码块。在try-with-resources语句中,任何的catch和finally代码块都在所有被声明的资源被关闭后执行。

被压抑的异常

try-with-resources语句相关联的代码块可能会抛出异常。try代码块中可能会抛出异常,并且有高达两个异常可能会在try-with-resources语句抛出。如果在try代码块中抛出一个异常,同时在try-with-resources语句中抛出一个或多个异常,那么在try-with-resources语句中抛出的异常就被压抑了,并且最终在方法抛出的异常就是try代码块中抛出的那个异常。你可以通过被try代码块抛出的异常的Throwable.getSuppressed方法找回被压抑的异常。

下面是测试

1.被压抑的异常

申明两个实现AutoCloseable接口的class,并在close方法中抛出异常

package jdk7_new_character;

/**
* @author 施俊杰
*/
public class AutoCloseableThrowableTestClass implements AutoCloseable { @Override
public void close() throws Exception {
System.out.println("close AutoCloseableThrowableTestClass");
throw new Exception("AutoCloseableThrowableTestClass exception");
} }
package jdk7_new_character;

/**
* @author 施俊杰
*/
public class AutoCloseableThrowableTestClass2 implements AutoCloseable { @Override
public void close() throws Exception {
System.out.println("close AutoCloseableThrowableTestClass2");
throw new Exception("AutoCloseableThrowableTestClass2 exception");
} }

创建测试class去创建上面申明的两个类

package jdk7_new_character;

public class ThrowableTestClass {

    public String testThrowable() throws Exception {

        try (AutoCloseableThrowableTestClass autoCloseableThrowableTestClass = new AutoCloseableThrowableTestClass();
AutoCloseableThrowableTestClass2 autoCloseableThrowableTestClass2 = new AutoCloseableThrowableTestClass2()) {
throw new Exception("exception3");
} } public static void main(String[] args) {
try {
new ThrowableTestClass().testThrowable();
} catch (Exception e) {
System.out.println(e.getMessage()); }
} }

运行结果

可以看到

AutoCloseableThrowableTestClass2 exception
AutoCloseableThrowableTestClass exception

两个exception被压抑了,我们可以通过Throwable.getSuppressed方法找回被压抑的异常,示例代码如下

package jdk7_new_character;

public class ThrowableTestClass {

    public String testThrowable() throws Exception {

        try (AutoCloseableThrowableTestClass autoCloseableThrowableTestClass = new AutoCloseableThrowableTestClass();
AutoCloseableThrowableTestClass2 autoCloseableThrowableTestClass2 = new AutoCloseableThrowableTestClass2()) {
throw new Exception("exception3");
} } public static void main(String[] args) {
try {
new ThrowableTestClass().testThrowable();
} catch (Exception e) {
System.out.println(e.getMessage());
Throwable[] suppressed = e.getSuppressed();
for (Throwable throwable : suppressed) {
System.out.println(throwable.getMessage());
}
}
} }

运行结果

本文属于原创,如有转载请注明出处

JDK7新特性try-with-resources语句的更多相关文章

  1. JDK7 新特性

    JDK7新特性的目录导航: 二进制字面值 switch 语句支持 String try-with-resources catch 多个类型异常 字面值中使用下划线 类型推断 改进泛型类型可变参数 其它 ...

  2. java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)

    一:jdk7新特性 可以表示二进制数值,以0b开头,中间可以使用下划线_分隔符.如下: @Test /** * 测试jdk新特性 */ public void testJdk7(){ int a=0b ...

  3. C# 9.0 新特性预览 - 顶级语句

    C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...

  4. JDK-7新特性,更优雅的关闭流-java try-with-resource语句使用

    前言 公司最近代码质量整改,需要对大方法进行调整,降低到50行以下,对方法的深度进行降低,然后有些文件涉及到流操作,很多try/catch/finally语句,导致行数超出规范值,使用这个语法可以很好 ...

  5. Java 新特性(3) - JDK7 新特性

    http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...

  6. Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)

    隐式数据结果特性将能简化从其他数据库到Oracle12c存储过程迁移.1. 背景T-SQL中允许查询结果的隐式返回.例如:下面T-SQL存储过程隐式返回查询结果.CREATE PROCEDURE Ge ...

  7. MySQL8.0新特性——支持原子DDL语句

    MySQL 8.0开始支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中.即使服务器在操作期间暂 ...

  8. JDK7新特性<八>异步io/AIO

    概述 JDK7引入了Asynchronous I/O.I/O编程中,常用到两种模式:Reactor 和 Proactor.Reactor就是Java的NIO.当有事件触发时,我们得到通知,进行相应的处 ...

  9. JDK7新特性

    二进制字面量 数字字面量可以出现下划线 switch语句可以用字符串 泛型简化 异常的多个catch合并 try..with...resource语句 import java.io.FileReade ...

随机推荐

  1. Android Edittext聚焦时输入法挡住了EditText输入框的两种解决方案

    方案一.把整个布局文件用ScrollView套住.这样当你聚焦时虽然输入法也能够挡住一些输入框,但是你可以通过手动滑动看被挡住的内容. 方案二.在Activity中设置android:windowSo ...

  2. POJ 2367 Genealogical tree 拓扑排序入门题

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8003   Accepted: 5184 ...

  3. Eclipse-快捷键大全(转载)

    快速展开类:ctrl + shift +*(小键盘) 快速关闭类:ctrl+ shift + /(小键盘)  Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl ...

  4. 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务

    引言: 由于近期网上盛传”百度搜索引擎已死“的消息,引发个人对于搜索引擎的思考.百度作为最大的中文搜索引擎,确实有着很大声誉,再加上本地化的优势,正成为国人们的首选,但是作为一名技术开发人员,使用搜索 ...

  5. 【Python实践-7】输出100以内的所有素数

    #输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). i= l=[] : k= ,i): : k=k+ : l.append(i) i=i+ print(" ...

  6. WPF编程,通过Double Animation同时动态缩放和旋转控件的一种方法。

    原文:WPF编程,通过Double Animation同时动态缩放和旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_4330793 ...

  7. POJ 1860&&3259&&1062&&2253&&1125&&2240

    六道烦人的最短路(然而都是水题) 我也不准备翻译题目了(笑) 一些是最短路的变形(比如最长路,最短路中的最长边,判环),还有一些就是裸题了. 1860:找环,只需要把SPFA的松弛条件改一下即可,这里 ...

  8. onSaveInstanceState和onRestoreInstanceState触发的时机

    先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vul ...

  9. 关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)

    关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位) 起因:在进行bootstrap的.navbar-brand内文字设置垂直居中时采用li ...

  10. 汉码盘点机PDA无缝对接思迅思迅盘点机思迅条码数据采集器批号商品盘点的方法

    1.1.    盘点批号 如果某些商品进行了批号管理,我们不仅仅要清点什么商品总数有多少个,我们还要区分该商品的某个批号有多少个数量,因此以前批号盘点工作量是非常大的. 我们的盘点机PDA支持批号盘点 ...