栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

try-with-resource语法糖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

try-with-resource语法糖

背景

在日常开发中,经常都是手动关闭资源,比如IO流,数据库连接等。如果忘关了就可能造成严重的性能后果。

try-finally带来的问题 1、代码不优雅

手动关闭IO流,特别是使用多个时,finally方法里写的嵌套代码真的是不堪入目,下面看一个例子:

 public static void main(String[] args) {

        BufferedInputStream inputStream = null;
        BufferedOutputStream outputStream = null;
        try {
            inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
            outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

因为要保证inputStream和outputStream都要正常关闭,所以往往会选择嵌套着写。

如果finally写成下面那样:

public static void main(String[] args) {

        BufferedInputStream inputStream = null;
        BufferedOutputStream outputStream = null;
        try {
            inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
            outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

当inputStream.close(); 出现异常了,就不会再运行 outputStream.close();了,就会一直无法释放资源。

2、异常屏蔽问题

当我们想向上层throws异常时,由于只能抛出一个异常,所以下面例子中,inputStream的异常就被outStream屏蔽了。

public static void main(String[] args) throws Exception {

        BufferedInputStream inputStream = null;
        BufferedOutputStream outputStream = null;
        try {
            inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
            outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        } finally {
            try {
                inputStream.close();
            } finally {
                outputStream.close();
            }
        }
    }

控制台只显示outStream的异常:

 

活用try-with-resource

Java 7后引人 try-with-resources,帮助我们快速解决资源释放。

上述代码使用try-with-resource,是不是优雅了很多!!

public static void main(String[] args) {
        try (
                BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        ) {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其实try-with-resource的原理就是帮我们自动补全close,下面是编译后的class,和我们try-finally写的是大同小异。

public static void main(String[] args) {
        try {
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));

            try {
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
                outputStream.close();
            } catch (Throwable var5) {
                try {
                    inputStream.close();
                } catch (Throwable var4) {
                    var5.addSuppressed(var4);
                }

                throw var5;
            }

            inputStream.close();
        } catch (Exception var6) {
            var6.printStackTrace();
        }

    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号