首页 技术 正文
技术 2022年11月17日
0 收藏 548 点赞 3,436 浏览 3472 个字

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.运行结果

JDK7新特性try-with-resources语句

可以看到你可以在一个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()); }
}}

运行结果

JDK7新特性try-with-resources语句

可以看到

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语句

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898