前言

开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭。但是这种写法是很不简洁的。其实,早在JDK1.7就已经引入了try-with-resources来关闭资源的方式,我们今天就来体验一下try-with-resources的简洁之处。

原创声明

本文首发于头条号【Happyjava】。Happy的掘金地址:https://juejin.im/user/5cc2895df265da03a630ddca,Happy的个人博客:(http://blog.happyjava.cn)[http://blog.happyjava.cn]。欢迎转载,但须保留此段声明。

旧版关闭资源的一些例子

在旧版的写法中(其实现在还有很多程序员是这么写的),资源都放在finally块里进行关闭,如下:

@Test
public void test4() {InputStream inputStream = null;try {inputStream = new FileInputStream("D:\\head.jpg");// do something} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}

这种写法的麻烦之处在于,我们需要在finally块中关闭资源,所以inputStream只能定义在try块的外面。关闭之前,还需要做一步判空,避免因为inputStream为空而导致的空指针异常。这种写法是很繁琐的。

try-with-resources

同样的功能,如果采用try-with-resources,就会使代码变得非常简洁:

@Test
public void test5() {try (InputStream inputStream = new FileInputStream("D:\\head.jpg")) {byte[] bytes = inputStream.readAllBytes();// do something} catch (IOException e) {e.printStackTrace();}
}

try-with-resources的用法就是,在try关键字的后面跟一个括号,把需要关闭的资源定义在括号内。在try块执行完之后会自动的释放掉资源。

什么资源可以被try-with-resources自动关闭

并不是所有资源都可以被try-with-resources自动关闭的,只有实现了java.lang.AutoCloseable接口的类,才可以被自动关闭。如果没有实现java.lang.AutoCloseable的类定义在try的括号内,则会在编译器就报错。

如,自定义一个类MyResource,定义在括号内则会报错:提示需要java.lang.AutoCloseable的类。

自定义可以被自动关闭的类

我们也可以把自己的类编写为可以被try-with-resources自动关闭的类,只需要我们去实现java.lang.AutoCloseable接口即可。

class MyResource implements java.lang.AutoCloseable {@Overridepublic void close() {System.out.println("调用了close方法");}
}
@Test
public void test5() {try (InputStream inputStream = new FileInputStream("D:\\head.jpg");MyResource myResource = new MyResource()) {byte[] bytes = inputStream.readAllBytes();// do something} catch (IOException e) {e.printStackTrace();}
}

执行之后,会输出“调用了close方法”

总结

try-with-resources可以使代码更加简洁而且不容易出错。相比传统的try-catch-finally的写法,显然try-with-resources优点更多,至少不会存在finally关闭资源因为没判空而导致空指针的问题。

转载于:https://www.cnblogs.com/happy4java/p/11206809.html

你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧相关推荐

  1. ajax catch,promise记得写上catch

    举个栗子,如果用户在没有登陆的条件下调用接口,那么所有接口都应该返回一个状态码表示用户没有登陆,此时需要跳转到登陆页进行登陆. 但是如果每次调用接口都需要判断一下,代码就会显得十分冗余,因此我们定义了 ...

  2. (五)改掉这些坏习惯,还怕写不出精简的代码?

    鲁迅说:嬉笑怒骂里充满了无奈和妥协. 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协. Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的 ...

  3. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...

    Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇, ...

  4. 50岁,他希望自己还可以写代码

    5月12日,以"高可用架构的技术变迁与演进"为主题,"云片技术开放日"在北京中关村创业大街氪空间顺利举行.本次活动邀请了360SRE工程师李冬.饿了么研发经理谭 ...

  5. capcreatecapturewindowa 说明_家长不批改作业,还需要写情况说明?

    原标题:家长不批改作业,还需要写情况说明? 近日,一段网友"吐槽家长群"的视频引发全民热议.不少网友抱怨,自己平时工作繁忙,还要应付家长群中老师给家长布置的各种任务,压力太大. 1 ...

  6. cuid卡写入后锁死_荣耀手机NFC升级了:公交、门禁、支付、饭卡、加密卡还能写卡...

    2019年双十一期间,入手了荣耀magic2手机,其实去年用过一次,今年换了多次还是特别喜欢,主要是麒麟980旗舰CPU,全面滑屏特有面子. 入手的第一时间,自己就启用了手机的钱包功能,手机钱包除了小 ...

  7. 徐磊(Devops):一名写了十几年代码但还没写够的程序员

    徐磊(Devops 社区领袖) [个人介绍] 徐磊,微软MVP(微软最有价值专家,大中华区域社区技术总监,Devops 社区领袖),从事过网管.技术支持.网络.软件开发等工作,一名写了十几年代码但还没 ...

  8. (三)改掉这些坏习惯,还怕写不出优雅的代码?

    Code Review 是一场苦涩但有意思的修行. 书接上篇,本次一起继续探讨一下,该如何写出优雅的代码? 1. 编码时:搞的复杂并不好  坏习惯一:多余的 if/else. 反例: 类似上面这种写法 ...

  9. (四)改掉这些坏习惯,还怕写不出健壮的代码?

    Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇, ...

最新文章

  1. C#连接MySql数据库的方法
  2. rcp errata
  3. 【代码笔记】iOS-浮动的云
  4. input 输入值的监听 禁止输入特殊字符
  5. 【剑指offer】_16 构建乘积数组
  6. 并发、并行、线程、进程与CPU基本概念
  7. Git笔记(13) 分支管理
  8. android 工程搭建,Android ApiDemo示例工程的创建
  9. #Win8# 开发你的第一个App《Dota宝典》
  10. python工程师干什么的_大数据开发工程师薪资待遇及招聘要求?
  11. 函数指针 和 函数指针数组 和 函数指针数组
  12. php红盟,php教程_CI框架源码完全分析之核心文件URI.php
  13. 经济金融学之1宏观经济学
  14. 查阅我们JavaScript学习新指南
  15. outlook vba html语言,在VBA中更改HTML电子邮件正文字体类型和大小
  16. 2021百度之星报名开启 特设“小星星”奖项鼓励少年AI人才
  17. 一款黑科技神器:uTools
  18. 怎么实现一个计算一年中有多少周?
  19. VB.NET绘图8---总结
  20. html chm 64,Win7 64位下的CHM

热门文章

  1. 【codevs1052】地鼠游戏
  2. arduino控制点阵屏与蜂鸣器_还在为遥控项目发愁?Arduino遥控套装解决你的所有问题(下)...
  3. Python入门--列表元素的修改
  4. redis主从复制_Redis 的主从复制(Master/Slave)
  5. OpenGL基础2:OpenGL简介
  6. 牛客网暑期ACM多校训练营7: C. Bit Compression(DFS+预处理)
  7. ZOJ 3987 2017CCPC秦皇岛 G:Numbers(高精度+贪心)
  8. C++ STL 容器元素排列之next_permutation和prev_permutation的使用示范
  9. python操作rabbitmq操作数据
  10. python后台架构Django教程——admin管理员站点