代码片段:
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 块中引发的任何结果异常都可能导致不需要的行为。