Findbugs 给我带来了一个打开两个Closeable
实例,但我不明白为什么。
Source
public static void sourceXmlToBeautifiedXml(File input, File output)
throws TransformerException, IOException, JAXBException {
FileReader fileReader = new FileReader(input);
FileWriter fileWriter = new FileWriter(output);
try {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
} finally {
try {
fileReader.close();
} finally {
fileWriter.close();
}
}
}
查找错误分析
Findbugs 告诉我
Method [...] may fail to clean up java.io.Reader [...]
并指向线FileReader fileReader = ...
Question
谁错了:我还是 Findbugs?
FindBugs 是正确的:如果 FileWriter 的构造函数抛出异常,文件读取器将不会关闭。要验证这一点,请尝试传递无效的文件名output
.
我会这样做:
FileReader fileReader = new FileReader(input);
try {
FileWriter fileWriter = new FileWriter(output);
try {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
} finally {
fileWriter.close();
}
} finally {
fileReader.close();
}
请注意,关闭时抛出的异常的处理可以改进,因为通过抛出异常来离开finally块将导致try语句通过抛出该异常而终止,吞掉try块中抛出的任何异常,这通常是对于调试更有用。请参阅 duffymo 的答案,了解如何避免这种情况的简单方法。
Edit:从 Java 7 开始,我们可以使用 try-with-resources 语句,它允许正确而简洁地处理这些极端情况:
try (
FileReader fileReader = new FileReader(input);
FileWriter fileWriter = new FileWriter(output)
) {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)