发生异常时如何正确关闭资源流
Posted
技术标签:
【中文标题】发生异常时如何正确关闭资源流【英文标题】:how to properly close resource streams in case of exceptions 【发布时间】:2017-08-29 16:10:17 【问题描述】:fortify 抱怨以下代码:
protected void doStuff() throws Exception
try (CSVReader csvReader = new CSVReader(new FileReader(file)))
...
String[] read;
read = csvReader.readNext();
...
在 FileReader 抛出异常的情况下。我是 java 新手,我不清楚为什么 try with resources 块不能处理这种情况。如何处理?
【问题讨论】:
确实如此。 Fortify 是错误的(除非 CSVReader 在关闭时没有关闭它包装的阅读器,这会令人惊讶)。 @JBNizet 或者在CSVReader
的构造过程中抛出异常。
fortify
可能太老了,无法理解尝试资源 - 不熟悉。 Java-6 中的这种构造将是失败的。
抱怨是什么意思?如果您遇到语法错误,那么您的编译器可能与 Java SE 1.7 不兼容。
是的。看到这个答案:***.com/a/21348893/638028
【参考方案1】:
最好先关闭较低级别的读取器实例,然后再关闭包装器级别的实例以避免内存泄漏。
所以先关闭 fileReader 的实例,然后再关闭 CSVReader。
FileReader fileReader= new FileReader(file)
CSVReader csvReader = new CSVReader(fileReader)
....
...
fileReader.close();
csvReader.close();
【讨论】:
以上是关于发生异常时如何正确关闭资源流的主要内容,如果未能解决你的问题,请参考以下文章
java中如果在关闭Socket时发生一个I/O错误,则会抛出一个啥异常?
Java避坑指南:finally块的陷阱及正确的关闭资源方式小
Java避坑指南:finally块的陷阱及正确的关闭资源方式小
Java避坑指南:finally块的陷阱及正确的关闭资源方式小