try-cache-finally读取文件错误try-with-resources使用方法
作者:全村最野的狗
引言
前些天项目经理找到我说,阿杰,你过来一下,我这有个小方法,你帮我写一下
- 需求: 提供一个文本文件,按行读取,然后给出一个回调函数,可以由调用者去实现对每行的处理.
我就想,你这不是瞧不起我吗.5分钟搞定!!嘴里却说,你这个有点难,我需要研究下大概今天下班前能完成.
5分钟过去了----> 代码完成
摸鱼3小时 ----> ok 代码一发,收工准备下班
public void clean2(String path, Consumer<String> consumer){ FileReader fileReader = null; BufferedReader br = null; try{ fileReader = new FileReader(path); br = new BufferedReader(fileReader); String line; while((line = br.readLine()) != null ){ consumer.accept(line); } }catch (IOException e){ // do }finally { try { if (br != null){ br.close(); } if (fileReader != null){ fileReader.close(); } } catch (IOException e) { // do } } }
项目经理 😶😶😶😶: 你tm明天别来了,自己去财务把这个月的结了,3行代码就写完的功能写成这个鬼样子.
那我就想啊,我写的这么完美,那凭什么开除我,经过我九九八十一天的苦思冥想,终于找到了问题的原因!!
try-cache-finally
try-finally
是java SE7之前我们处理一些需要关闭的资源的做法,无论是否出现异常都要对资源进行关闭。*
如果try块和finally块中的方法都抛出异常那么try块中的异常会被抑制(suppress),只会抛出finally中的异常,而把try块的异常完全忽略。
这里如果我们用catch
语句去获得try
块的异常,也没有什么影响,catch
块虽然能获取到try
块的异常但是对函数运行结束抛出的异常并没有什么影响。
try-with-resources
try-with-resources
语句能够帮你自动调用资源的close()
函数关闭资源不用到finally
块。
前提是只有实现了Closeable
接口的才能自动关闭
public void clean(String path, Consumer<String> consumer) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { String line; while((line = br.readLine()) != null ){ consumer.accept(line); } } }
这是try-with-resources
语句的结构,在try关键字后面的( )里new
一些需要自动关闭的资源。
这个时候如果方法 readLine
和自动关闭资源的过程都抛出异常,那么:
- 函数执行结束之后抛出的是try块的异常,而try-with-resources语句关闭过程中的异常会被抑制,放在try块抛出的异常的一个数组里。(上面的非try-with-resources例子抛出的是finally的异常,而且try块的异常也不会放在fianlly抛出的异常的抑制数组里)
- 可以通过异常的
public final synchronized Throwable[] getSuppressed()
方法获得一个被抑制异常的数组。 try
块抛出的异常调用getSuppressed()
方法获得一个被它抑制的异常的数组,其中就有关闭资源的过程产生的异常。
try-with-resources 语句能放多个资源,使用 ; 分割
try ( BufferedReader br = new BufferedReader(new FileReader(path)); ZipFile zipFile = new ZipFile(""); FileReader fileReader = new FileReader(""); ) { }
最后任务执行完毕或者出现异常中断之后是根据new
的反向顺序调用各资源的close()
的。后new
的先关。
try-with-resources 语句也可以有 catch 和 finally 块
public void clean3(String path, Consumer<String> consumer){ try (BufferedReader br = new BufferedReader(new FileReader(path))) { System.out.println("RuntimeException 前"); int a = 1/0; System.out.println("RuntimeException 后"); }catch (RuntimeException e){ System.out.println("抛出 RuntimeException"); }catch (IOException e){ System.out.println("抛出 RuntimeException"); }finally { System.out.println("finally"); } }
RuntimeException 前
抛出 RuntimeException
finally
以上就是try-cache-finally读取文件错误try-with-resources使用方法的详细内容,更多关于try-with-resources读取文件的资料请关注脚本之家其它相关文章!