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. ptrace注入型病毒“聊天剽窃手”分析

    概述 “聊天剽窃手”Windseeker是一款间谍软件,它使用了ptrace进程注入技术,能够对微信和QQ的聊天记录进行监控. 软件安装后的桌面图标和启动界面如图所示:   行为分析 该应用首先获取手 ...

  2. js实现60秒倒计时效果(使用了jQuery)

    今天碰到要实现一个类似那种短信验证码60秒倒计时的需求,好久不写js,有点手生.把代码记录下,方便后续查阅. 这里我用了jQuey,毕竟写起来简洁点.下面直接看效果和代码. 一.效果          ...

  3. VS编程,WPF单独更改TextBlock中部分文字格式的一种方法

    原文:VS编程,WPF单独更改TextBlock中部分文字格式的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  4. Android开发——为EditText添加烟花效果的实现

    )什么时候发射烟花:监听EditText的文字改变,获取文字数量的变化以确定风的方向,还有获取光标的位置确定爆炸的位置.光标的位置没有具体的方法确定坐标,要通过反射自己计算. 2.  主要实现类 库里 ...

  5. 12、JAVA内存模型与线程

    一.JMM 有序性,可见性,原子性 synchorize :3个性都有: volatile:保证可见性+禁止指令重排: 二.线程的五种状态 面向过程与面向对象的差别 面向过程:站在计算机的角度分析和解 ...

  6. Remote 桌面的win2003 servre端设定

    Microsoft Windows [版本 5.2.3790](C) 版权所有 1985-2003 Microsoft Corp. C:\Documents and Settings\Administ ...

  7. html点击链接打开新窗口

    html标记中格式为<a href="url"> text </a> 此时,内容在原来窗口呈现,如果想新开窗口,可以采用下列方式. 1. <a hre ...

  8. SQL Server 常用内置函数

    本文用于收集在运维中经常使用的系统内置(built-in)函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID ...

  9. 10、Dockerfile实战-PHP

    一.镜像制作步骤 安装编译依赖包 编译安装 配置 二.编写Dockerfile FROM centos:7 MAINTAINER QUNXUE RUN yum install -y gcc gcc-c ...

  10. Git的简单操作

    一.Git安装 windows下,可在在git官网下载(https://git-scm.com/downloads) 也有360提供的git(http://baoku.360.cn/soft/show ...