别再在finally里面释放资源了,解锁个新姿势!

   日期:2020-11-07     浏览:88    评论:0    
核心提示:不会吧,不会吧,不会还有人还在用finally释放资源吧?(开个玩笑,没有嘲讽的意思哈~)

版权说明: 本文由博主原创,转载请注明出处。
原文地址: https://blog.csdn.net/qq_38688267/article/details/109511716

       在我们编码过程中,不可避免的会用到于文件操作 IO 流、数据库连接等开销比较大的资源,用完之后需要通过 close 方法将其关闭,否则资源一直处于打开状态,可能会导致内存泄露等问题。

       拿文件操作流举例,我们在使用时要try catch,用完了在finally中关闭,而关闭的时候还需要再try catch,可以说是非常麻烦了!代码如下:

        
        BufferedReader br = null;
        try { 
            br = new BufferedReader(new FileReader(""));
            String line;
            while ((line = br.readLine()) != null) { 
                System.out.println(line);
            }
        } catch (IOException e) { 
            // DO something
        } finally { 
            if(br != null) { 
                try { 
                    br.close();
                } catch (IOException e) { 
                    // DO something
                }
            }
        }

       
       而我们的新姿势是使用JDK1.7中的try-with-resources语法,直接上代码:

        
        try (BufferedReader br1 = new BufferedReader(new FileReader(""))) { 
            String line;
            while ((line = br1.readLine()) != null) { 
                System.out.println(line);
            }
        } catch (IOException e) { 
            // DO something
        }

       代码是不是瞬间清爽了很多?赶紧用起来吧~
       

       我们顺便再来刨根究底一下吧,看下他编译之后的样子:

        try { 
            BufferedReader br1 = new BufferedReader(new FileReader(""));
            Throwable var7 = null;

            try { 
                String line;
                try { 
                    while((line = br1.readLine()) != null) { 
                        System.out.println(line);
                    }
                } catch (Throwable var32) { 
                    var7 = var32;
                    throw var32;
                }
            } finally { 
                if (br1 != null) { 
                    if (var7 != null) { 
                        try { 
                            br1.close();
                        } catch (Throwable var31) { 
                            var7.addSuppressed(var31);
                        }
                    } else { 
                        br1.close();
                    }
                }
            }
        } catch (IOException var34) { 
        }

       其实背后的原理也很简单,让编译器都帮我们做了关闭资源的工作而已。所以,再次印证了,语法糖的作用就是方便程序员的使用,最终还是要转成编译器认识的语言。

       希望本文对大家有所帮助或启发。码字不易,觉得写的不错的可以点赞支持一下哦~

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服