发生异常时如何正确关闭资源流

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块的陷阱及正确的关闭资源方式小

Java避坑指南:finally块的陷阱及正确的关闭资源方式小

httpWebRequest.GetResponse() 基础连接已关闭 发送时发生错误