gpt4 book ai didi

java - 我应该如何使用 `try-with-resources` 中的 IOException 嵌套在 header 中带有`throws IOException`的方法中?

转载 作者:行者123 更新时间:2023-11-30 06:18:24 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com