我看到了这段代码,想知道为什么in.close()是在finally block中完成的。try-with resources的要点是closes resources是正确的。
File file = new File(FILE_NAME);
FileInputStream in = null;
try (in = new FileInputStream(file)){
//do something
} catch (final FileNotFoundException e) {
log.log(Level.WARNING, "file not found, " + file.getAbsolutePath(), e);
} catch (final IOException e) {
log.log(Level.WARNING, "cannot access the file for reading", e);
} finally {
if (in != null){
try {
in.close();
} catch (final IOException e) {
log.log(Level.WARNING, "Attempt to close file failed.", e);
}
}
}在Java中,是否会出现可以使用try-with-resources打开文件但不能关闭文件的情况?
发布于 2014-02-05 06:27:41
示例中的finally块是冗余的。try-with-resources语句基本上也在做同样的事情(但更不容易出错!)。因为它是在try-- resources语句试图关闭资源之后执行的,所以finally块本质上是一个noop (可能存在第二次尝试在第一次失败后成功关闭资源的可能性-但是如果这是可能的,那么它是可以忽略的边缘情况,并且肯定是不确定的)。
请注意,相比之下,catch块非常重要。关闭资源的尝试将在激活catch块之前发生,从而导致发生多个异常的可能性。这可以通过使用禁止的异常来解决。因此,如果使用资源失败,仍然会尝试正确地关闭它(通常也会失败),和 catch块将收到第一个(最有可能是根)原因,而不是在关闭时抛出的异常,隐藏第一个错误。
有关更多信息,请参阅官方documentation!
发布于 2014-02-05 06:22:48
这并不是文件所独有的,它通常发生在I/O中。
Java API指定,如果“发生I/O错误”,InputStream的close()方法可能会启动一个异常。
所以,是的,这是可能发生的,这种行为会产生有趣的(或不那么有趣的)try-catch-catch try-catch块。
发布于 2014-02-05 06:22:56
我会用一些可移动存储(比如U盘)做一个简单的测试:
只需编写一个程序,用U盘中的文件打开FileInputStream,然后提示“请移除存储设备”,等待,然后尝试in.close()。我敢打赌一定会抛出一些IOException。
https://stackoverflow.com/questions/21564601
复制相似问题