首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭文件会失败吗?

关闭文件会失败吗?
EN

Stack Overflow用户
提问于 2014-02-05 06:11:32
回答 4查看 883关注 0票数 2

我看到了这段代码,想知道为什么in.close()是在finally block中完成的。try-with resources的要点是closes resources是正确的。

代码语言:javascript
复制
  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打开文件但不能关闭文件的情况?

EN

回答 4

Stack Overflow用户

发布于 2014-02-05 06:27:41

示例中的finally块是冗余的。try-with-resources语句基本上也在做同样的事情(但更不容易出错!)。因为它是在try-- resources语句试图关闭资源之后执行的,所以finally块本质上是一个noop (可能存在第二次尝试在第一次失败后成功关闭资源的可能性-但是如果这是可能的,那么它是可以忽略的边缘情况,并且肯定是不确定的)。

请注意,相比之下,catch块非常重要。关闭资源的尝试将在激活catch块之前发生,从而导致发生多个异常的可能性。这可以通过使用禁止的异常来解决。因此,如果使用资源失败,仍然会尝试正确地关闭它(通常也会失败),和 catch块将收到第一个(最有可能是根)原因,而不是在关闭时抛出的异常,隐藏第一个错误。

有关更多信息,请参阅官方documentation

票数 4
EN

Stack Overflow用户

发布于 2014-02-05 06:22:48

这并不是文件所独有的,它通常发生在I/O中。

Java API指定,如果“发生I/O错误”,InputStream的close()方法可能会启动一个异常。

所以,是的,这是可能发生的,这种行为会产生有趣的(或不那么有趣的)try-catch-catch try-catch块。

票数 1
EN

Stack Overflow用户

发布于 2014-02-05 06:22:56

我会用一些可移动存储(比如U盘)做一个简单的测试:

只需编写一个程序,用U盘中的文件打开FileInputStream,然后提示“请移除存储设备”,等待,然后尝试in.close()。我敢打赌一定会抛出一些IOException

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21564601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档