JDK7新特性try-with-resources语句
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语句的更多相关文章
- JDK7 新特性
JDK7新特性的目录导航: 二进制字面值 switch 语句支持 String try-with-resources catch 多个类型异常 字面值中使用下划线 类型推断 改进泛型类型可变参数 其它 ...
- java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)
一:jdk7新特性 可以表示二进制数值,以0b开头,中间可以使用下划线_分隔符.如下: @Test /** * 测试jdk新特性 */ public void testJdk7(){ int a=0b ...
- C# 9.0 新特性预览 - 顶级语句
C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...
- JDK-7新特性,更优雅的关闭流-java try-with-resource语句使用
前言 公司最近代码质量整改,需要对大方法进行调整,降低到50行以下,对方法的深度进行降低,然后有些文件涉及到流操作,很多try/catch/finally语句,导致行数超出规范值,使用这个语法可以很好 ...
- Java 新特性(3) - JDK7 新特性
http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...
- Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)
隐式数据结果特性将能简化从其他数据库到Oracle12c存储过程迁移.1. 背景T-SQL中允许查询结果的隐式返回.例如:下面T-SQL存储过程隐式返回查询结果.CREATE PROCEDURE Ge ...
- MySQL8.0新特性——支持原子DDL语句
MySQL 8.0开始支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中.即使服务器在操作期间暂 ...
- JDK7新特性<八>异步io/AIO
概述 JDK7引入了Asynchronous I/O.I/O编程中,常用到两种模式:Reactor 和 Proactor.Reactor就是Java的NIO.当有事件触发时,我们得到通知,进行相应的处 ...
- JDK7新特性
二进制字面量 数字字面量可以出现下划线 switch语句可以用字符串 泛型简化 异常的多个catch合并 try..with...resource语句 import java.io.FileReade ...
随机推荐
- cloudstack 创建虚拟机失败
Trying to find a potenial host and associated storage pools from the suitable host/pool lists for th ...
- ASP.NET Core MVC 模型绑定 (转载)
ASP.NET Core MVC的Model Binding会将HTTP Request数据,以映射的方式对应到参数中.基本上跟ASP.NET MVC差不多,但能Binding的来源更多了一些.本篇将 ...
- 关于EL表达式中requestScope和param区别
今天演示EL表达式的时候发现自己jsp的基础实在是薄弱,在这个很简单的问题上迷惑了很久. 首先在看遇到的问题: 在浏览器地址输入,表示传入一个参数test,值为123 http://localhost ...
- Latex数学公式编写
小叙闲言 一直想用latex来编辑文档,但是没有需求,所以也没有去学习一下,但是最近由于要大量敲数学公式,有了latex数学公式的需求,所以来稍稍总结学习一下 1.在MathType中编写Latex数 ...
- 【干货】YUM安装PHP 7版本后,增加phalcon框架的报错解决
目录 1.yum安装php 7.x版本,此处部署7.3版本 2.安装phalcon框架 2.1.PHP版本依赖关系 2.2.编译phalcon扩展模块 2.3.增加扩展文件 3.部署phalcon遇到 ...
- BugkuCTF 文件上传测试
前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...
- linux下SpringBoot Jar包自启脚本配置
今天整理服务器上SpringBoot项目发现是自启的,于是想看看实现.翻看离职同事的交接文档发现一个***.service文件内容如下 [Unit] Description=sgfront After ...
- manjaro安装软件
fcitx 安装以下包 fcitx-googlepinyin kcm-fcitx 安装了输入法之后,还要在/etc/profile或~/.xprofile里添加如下内容: export GTK_IM_ ...
- ngnix的基本安装及配置 centos7
1.centos7 挂载ngnix的源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7- ...
- 详细解析 nginx uri 如何匹配 location 规则
location 是 nginx 配置中出现最频繁的配置项,一个 uri 是如何与多个 location 进行匹配的? 在有多个 location 都匹配的情况下,如何决定使用哪一个 location ...