美文网首页互联网科技Java 杂谈
你是否还在写try-catch-finally?用try-wit

你是否还在写try-catch-finally?用try-wit

作者: java菲 | 来源:发表于2019-06-28 11:02 被阅读5次


前言

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

旧版关闭资源的一些例子

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

@Testpublicvoidtest4(){    

InputStream inputStream =null;

try{        

inputStream =newFileInputStream("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,就会使代码变得非常简洁:

@Testpublicvoidtest5(){

try(InputStream inputStream =newFileInputStream("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接口即可。

classMyResourceimplementsjava.lang.AutoCloseable{

@Overridepublicvoidclose(){        

System.out.println("调用了close方法");    

}

}

@Testpublicvoidtest5(){

try(InputStream inputStream =newFileInputStream("D:\\head.jpg");        

 MyResource myResource =newMyResource()) {

byte[] bytes = inputStream.readAllBytes();

// do something}catch(IOException e) {       

 e.printStackTrace();   

 }

}

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

总结

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

相关文章

  • 你是否还在写try-catch-finally?用try-wit

    前言 开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资...

  • 你是否还在写try-catch-finally?来使用try-w

    前言 开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资...

  • 你还在使用 try-catch-finally 关闭资源?

    代码一定得写的优雅一点! 你还在使用try-catch-finally关闭资源吗,如果是,那么就有点out了。现在...

  • try-catch-finally的执行顺序以及 try-wit

    执行顺序是先 try或catch 然后是 finally,但是finally里的语句按定义是肯定要执行的,所以在代...

  • 思绪

    你是否还在想我 你是否还在想我,用那种清澈的目光注视着刚升起的朝阳 你是否还在想我,站在马路边任由和风吹荡 你是否...

  • 其实,作为程序猿技术分享不光只有写博客

    你是否还在过着每天吃饭、睡觉、写代码的生活? 你是否还在偷偷地学习偷偷地积累着自己的工作经验? 你是否羡慕那些资深...

  • 你写的那封信

    你写的那封信 那记忆里的青春是否还在 那个爱你的女孩是否还在 是否浪漫了你的一生 是否与你守望到老 好一篇小手稿 ...

  • 你绝对想不到的,自我提升的五个小窍门💕

    你是否还在为成绩不好而烦恼呢?你是否还在为写不好作文而沮丧?你又是否在为书背不了,英语单词记不下来而心急如焚?不...

  • 你是否还在

    一个故事 2015年我们相遇,我们都是高三生。在最后冲刺的时候你和我表白了,我们在一起了,我们每天开心的一...

  • 你是否还在

    岁月流逝,瞬间而过,你是否还在世界的哪个角落等待着我的到来,人生在世,有很多不如意,在无奈中苦苦坚持,...

网友评论

    本文标题:你是否还在写try-catch-finally?用try-wit

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