首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁捕获异常,在close方法中出现?(try-with-resources)

谁捕获异常,在close方法中出现?(try-with-resources)
EN

Stack Overflow用户
提问于 2014-07-13 17:39:37
回答 5查看 364关注 0票数 0

接口AutoClosable具有以下方法声明:

代码语言:javascript
复制
void close()  throws Exception

因此我们可以看到方法close会抛出异常。

当我写代码try-with resources时,它看起来是这样的:

代码语言:javascript
复制
private static void printFileJava7() throws IOException {

    try(FileInputStream input = new FileInputStream("file.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }
}

在这段代码中没有异常处理。

我不明白如果close方法抛出异常会发生什么。

EN

回答 5

Stack Overflow用户

发布于 2014-07-13 17:43:43

Java在try-with-resources块中捕获并抑制close方法抛出的异常。

你可以在这里阅读更多关于这方面的内容,特别是第二个代码样本之后的段落。http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

票数 2
EN

Stack Overflow用户

发布于 2014-07-13 17:44:59

这个特殊场景的关键是“受抑制的异常”。

“每当主体中引发异常,然后try-with-resources语句又引发异常时,只有在try主体中引发的异常才有资格被异常处理代码捕获。所有其他异常都被视为受抑制的异常”

这是Java7.0中的一个新概念,因此您将获得与只有printfileJava7类抛出异常时相同的输出,因为close()方法抛出的CloseException将被抑制。

请参考When two exceptions are thrown by the try-with-resources construct link.Which已经采取了您所要求的确切方案

票数 0
EN

Stack Overflow用户

发布于 2014-07-13 17:45:31

您说得对,AutoClosable中定义的close()方法抛出了异常。但是,扩展AutoClosable的其他名为Closable的接口重新定义了此方法,如下所示:

void close() throws IOException

所有与IO相关的类都实现Closable,因此它们的close()方法抛出IOException。但是您的方法也会抛出它,所以在您的代码中没有人会捕捉到这个异常。一如既往,它将被应用程序的上层捕获,或者被JVM本身捕获,如果之前没有人捕获它的话。

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

https://stackoverflow.com/questions/24721358

复制
相关文章

相似问题

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