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

时间:2018-01-05 21:57:42

标签: java exception-handling try-catch try-catch-finally try-with-resources

代码段:

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块。 或者当前行为是最合适的行为。

所有评论和答案都表示赞赏。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

警告: ExternalServiceObject必须实现AutoCloseable

答案 2 :(得分:2)

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

答案 3 :(得分:1)

可以使用try-with-resources块来关闭InputStream。它更具可读性,更不笨重。 InputStream实现AutoCloseable,因此在退出try-with-resources块时,将自动调用类的close方法。如果您只将InputStream用于try-catch-finally块的范围,那么您应该将其移动到try块。

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