AFAIK,标准try-with-resources
形式
try(InputStream is= new ...){
... some reading from is
} catch (..){
... catching real problems
}
catch (IOException e) {
... if closing failed, do nothing - this clause is demanded by syntax
}
相当于:
try{
InputStream is= new ...
... some reading from is
} catch (..){
... catching real problems
} finally {
try{
is.close();
} catch (IOException e) {
... if closing failed, do nothing
}
}
当然,第一个变体更简单。但我看到第二种情况是绝对可以的,而第一种就变得难以理解。
想象一下这样的情况,当您获得代码时,try(){}
出现在带有 throws IOExceptions
子句的函数中。
String readFromFile(...) throws IOException{
...
try(...){
...
}
}
第二个 catch 中的 IOException 会吃掉所有 IOException,无论是否连接到关闭尝试。并且什么也不做。我想,在该方法之外的某个地方,有一段代码可以处理该 IOException 并执行一些值得注意的操作。例如,记录堆栈。因此,本地的渔获量永远不会达到。我们对第二个 catch 子句不感兴趣,但通常,我们需要对第一个 catch 子句进行一些特殊的 react 。
另一方面,如果我们删除结束的 catch(IOException e){}
子句,并依赖于方法头中的 throws
,那对我们来说绝对无趣将对关闭异常使用react。
当我们通过 IOException 捕获关闭问题时,我认为没有办法解决这个问题。 Eclipse java 编辑器要求我对该子句使用这个异常!
如何将关闭时出现的 IOException 与 try{} 主体中出现的其他 IOException 分开?
最佳答案
我认为 Java 应该为此负责。 close() 方法应该抛出与 IOException 不同的异常,调用者对此几乎无能为力。您唯一的解决方案是在重新抛出之前重新包装您感兴趣的 IOException。
通常我所做的是将 try block 的全部内容提取到它自己的方法中,在该方法中我可以捕获任何 IOException 并将它们作为自定义异常重新抛出。然后我可以在 catch block 中单独捕获剩余的 IOException。
public void foo() throws CustomException {
try (InputStream is= new ...) {
bar(is); //This catches internal IOExceptions and throws a CustomException
}
catch (IOException e) { //The close() exception
}
}
关于java - 我应该如何使用 `try-with-resources` 中的 IOException 嵌套在 header 中带有`throws IOException`的方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705633/