当 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
代码段:
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