代码之家  ›  专栏  ›  技术社区  ›  Kartavya Ramnani

当Try块中的多行引发异常时,使用Try With Resources,而不是finally block

  •  0
  • Kartavya Ramnani  · 技术社区  · 7 年前

    代码段:

    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 回复  |  直到 7 年前
        1
  •  4
  •   AJNeufeld    7 年前

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

    try (InputStream inputStream = externalService.getObject().getInputStream()) {
        // further uses of inputStream
    } catch (Exception e) {
        // ... logging etc
        throw e;
    }
    
        2
  •  3
  •   Andy Turner    7 年前

    我认为资源试用中的执行顺序是自上而下的 (与所有其他java变量定义一样)

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

    注意事项: ExternalServiceObject必须实现AutoCloseable

        3
  •  2
  •   Andy Turner    7 年前

    因此,如果您想使用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?
    }
    
        4
  •  1
  •   SirCipher    7 年前

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

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