JDK7的Try-catch-resources

先上码

    @Test
    private void TestForNormal() {
        InputStream inputStream = TryCatchDemo.class.getResourceAsStream("/test.md");
        BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder sb = new StringBuilder();
        String tmpString = null;
        try {
            while ((tmpString = bf.readLine()) != null) {
                sb.append(tmpString);
            }
            System.out.println(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bf.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

这是以前最常用的写法对流进行操作,一般来说,在最后都会有一堆嵌套着try-catch的迷之finally用来关闭占用的资源流,忘记关的另说...

语言总是在进步


JDK7 中,出现了一种新的语法糖 try-with-resource
现在,新的语法支持这样玩

 @Test
    public void TestForTryWithResources() {
        try (InputStream inputStream = new FileInputStream("/test.md");
//        InputStream inputStream = TryCatchDemo.class.getResourceAsStream("/test.md")
             BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream))
        ) {
            StringBuilder sb = new StringBuilder();
            String tmpString = null;
            while ((tmpString = bf.readLine()) != null) {//抛出IOException的地方
                sb.append(tmpString);
            }
            System.out.println(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

它的结构是

try( ){
}

关键在

        try (InputStream inputStream = new FileInputStream("/test.md");
//        InputStream inputStream = TryCatchDemo.class.getResourceAsStream("/test.md")
             BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream))
        )

因为括号里头的InputStream ,BufferedReader 都实现了一个AutoCloseable接口,所以无论这段代码是正常执行完,还是有异常往外抛,还是内部代码块发生异常被截获,最终都会按照创建资源的逆顺序,自动关闭资源

实验


    @Test
    public void AutoCloseTest() {
        try (AutoCloseAbleBean autoCloseable = new AutoCloseAbleBean()) {
            throw new RuntimeException("test");
//            autoCloseable.dosomething();
//            return;
        } catch (Exception e) {
            e.printStackTrace();
//            throw new RuntimeException("test");
        }finally {
            throw new RuntimeException("test");
        }
    }

    class AutoCloseAbleBean implements AutoCloseable {
        @Override
        public void close() throws Exception {
            System.out.println("i am close");
        }
        void dosomething() {
            System.out.println("before close");
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  •  try-with-resources语句是一个声明一个或多个资源的 try 语句。一个资源作为一个对象,必须在程...
    xdoyf阅读 3,484评论 0 0
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,147评论 0 62
  • 第一阶段java基础复习 1.软件开发基础 1.1开发软件的目的 提高人个计算机之间的交互方式 1.2软件 软件=...
    allencaicai阅读 507评论 0 0
  • 动物的拟态想必大家都见识过,在我们儿时的记忆里,竹节虫、变色龙曾经令我们几多感慨。而我想要说的是 ,植物界...
    马玉露阅读 7,344评论 0 0