当 try 块中的多行抛出异常时,使用 Try-With-Resources 而不是 finally 块

Use Try-With-Resources instead of finally block when multiple lines in try block throws exception

代码段:

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 重构此代码,从而避免 finally 块。 或者说现在的行为是不是最合适的行为

感谢所有评论和回答。

可以使用 try-with-resources 块关闭 InputStream。它更具可读性并且不那么笨拙。 InputStream 实现了 AutoCloseable,因此在退出 try-with-resources 块时,将自动调用 class 的关闭方法。如果您仅将 InputStream 用于 try-catch-finally 块的范围,那么您应该将其移至 try 块。

此外,您应该避免(在可能的情况下)捕获异常。在 try 块中抛出的任何结果异常都可能导致不需要的行为。

因此,如果您想使用 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?
}

如果您不需要外部服务对象来做其他事情:

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

我相信 try-with-resources 中的执行顺序是自上而下的 (与所有其他 java 变量定义一样)

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

警告: ExternalServiceObject 必须实现 AutoCloseable