博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK7新特性try-with-resources语句
阅读量:5292 次
发布时间:2019-06-14

本文共 4312 字,大约阅读时间需要 14 分钟。

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());            }        }    }}

运行结果

 

 

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

转载于:https://www.cnblogs.com/s648667069/p/8862306.html

你可能感兴趣的文章
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
opencv安装配置
查看>>
JAVA-初步认识-第六章-面向对象(举例)
查看>>
js合并数组
查看>>
cNoteSetCursor_命令窗口光标设置
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
Benelux Algorithm Programming Contest 2014 Final(第二场)
查看>>
随机变量的期望为什么把不是自己密度函数当成自己的权重来求期望呢?
查看>>
6-1 并行程序模拟 uva210
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
javascript知识点记录01
查看>>