代码段:
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块。 或者当前行为是最合适的行为。
所有评论和答案都表示赞赏。
答案 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块中抛出的任何结果异常都可能导致不必要的行为。