美文网首页
JDK7的Try-catch-resources

JDK7的Try-catch-resources

作者: 量产型炮灰工程师 | 来源:发表于2017-06-06 16:49 被阅读0次

    先上码

        @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");
            }
        }
    

    相关文章

      网友评论

          本文标题:JDK7的Try-catch-resources

          本文链接:https://www.haomeiwen.com/subject/afxnfxtx.html