当前位置: 首页 > 后端技术 > Java

《Effective Java》第9条:try-with-resources优先于try-finally

时间:2023-04-01 16:31:11 Java

《Effective Java》第九条:try-with-resources优先于try-finallyclose关闭资源,如:InputStream、OutputStream和java.sql.Connection。如果在编程时不关闭,会造成性能问题。2、示例,使用try-finally关闭资源,如下:尝试{返回br.readLine();}最后{br.close();}}}如果有两个资源,我们会这样写,但是不推荐。公共类Copy_Version1{finalstaticintBUFFER_SIZE=1024;staticvoidcopy(Stringsrc,Stringdst)抛出IOException{InputStreamin=newFileInputStream(src);尝试{OutputStreamout=newFileOutputStream(dst);试试{byte[]bu=newbyte[BUFFER_SIZE];诠释n;while((n=in.read(buf))>0){out.write(buf,0,n);}}最后{out.close();}}最后{in.close();}}}这样写可以正确关闭资源,但是不推荐这样写,为什么呢?因为try块和finally块都会抛出异常。在这种情况下,第二个异常完全消除了第一个异常。异常堆栈跟踪中没有第一个异常的记录。在实际系统中进行调试会变得非常复杂。3、实例,使用try-with-resourcesJava7引入了try-with-resources语句来解决上述问题。要使用这个构造的资源,它必须实现AutoClosable接口。如果你写一个类,如果它代表一个必须关闭的资源,那么这个类也应该实现AutoClosable接口。让我们重写firstLineFoFile和复制方法:}}}如果调用readLine和close方法抛出异常,则抛出第一个异常,禁止抛出第二个异常。这些禁止的异常不会被抛出,但也会打印在异常堆栈上。公共类Copy_Version2{finalstaticintBUFFER_SIZE=1024;staticvoidcopy(Stringsrc,Stringdst)抛出IOException{try(InputStreamin=newFileInputStream(src);OutputStreamout=newFileOutputStream(dst)){=te[]bufnewbyte[BUFFER_SIZE];诠释n;while((n=in.read(buf))>0){out.write(buf,0,n);}}}}try-with-resources也可以使用catch语句,这样就可以在不应用另一层代码的情况下处理异常。公共类FirstLineOfFile_Version3{staticStringfirstLineOfFile(Stringpath,StringdefaultVal){try(BufferedReaderbr=newBufferedReader(newFileReader(path))){returnbr.读线();}catch(IOExceptione){returndefaultVal;}}}4.总结在处理必须关闭的资源时,优先使用try-with-resources。这样写出来的代码简洁明了,产生的异常也更有价值。