使用“尝试资源”,而不是在 try 块中的多行引发异常时最终阻止



代码片段:

InputStream inputStream = null;
try{
    ExternalServiceObject object = externalService.getObject();
    inputStream = object.getInputStream();
    // further uses of inputStream
 } catch(Exception e){
   throw e;
  } finally {
        if(inputStream != null)
           inputStream.close();
  }

在这里,externalService.getObject(( 也可以抛出异常。

希望使用try-with-resources重构此代码,从而避免最终块。或者当前行为是最合适的行为。

感谢所有评论和答案。

如果您不需要外部服务对象进行其他任何操作:

try (InputStream inputStream = externalService.getObject().getInputStream()) {
    // further uses of inputStream
} catch (Exception e) {
    // ... logging etc
    throw e;
}
我相信

资源尝试中的执行顺序是自上而下的(与所有其他 Java 变量定义一样(

try
(
    ExternalServiceObject externalServiceObject = externalService.getObject(),
    InputStream inputStream = externalServiceObject.getInputStream();
)
{
    // further uses of inputStream
}
catch (Exception e)
{
    // do stuff.
}

警告:外部服务对象必须实现自动关闭

因此,如果您想使用资源,请使用 try-with-resources:

try {
  ExternalServiceObject object = externalService.getObject();
  try (InputStream inputStream = object.getInputStream()) {
    // ...
  }
} catch (Exception e) {
  throw e; // But why catch it only to rethrow?
}

输入流的关闭可以使用资源尝试块来完成。它更具可读性且不那么笨拙。InputStream 实现了 AutoCloseable,因此在退出资源尝试块时,将自动调用类的 close 方法。如果您仅将输入流用于try-catch-finally 块的范围,则应将其移动到try块。

此外,您应该避免(如果可能(捕获异常。在 try 块中引发的任何结果异常都可能导致不需要的行为。

相关内容

  • 没有找到相关文章

最新更新