接口AutoClosable具有以下方法声明:
void close() throws Exception因此我们可以看到方法close会抛出异常。
当我写代码try-with resources时,它看起来是这样的:
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方法抛出异常会发生什么。
发布于 2014-07-13 17:43:43
Java在try-with-resources块中捕获并抑制close方法抛出的异常。
你可以在这里阅读更多关于这方面的内容,特别是第二个代码样本之后的段落。http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
发布于 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已经采取了您所要求的确切方案
发布于 2014-07-13 17:45:31
您说得对,AutoClosable中定义的close()方法抛出了异常。但是,扩展AutoClosable的其他名为Closable的接口重新定义了此方法,如下所示:
void close() throws IOException
所有与IO相关的类都实现Closable,因此它们的close()方法抛出IOException。但是您的方法也会抛出它,所以在您的代码中没有人会捕捉到这个异常。一如既往,它将被应用程序的上层捕获,或者被JVM本身捕获,如果之前没有人捕获它的话。
https://stackoverflow.com/questions/24721358
复制相似问题