由于这是关于 try/finally 子句行为的学术问题,因此我尝试使用一个非常通用的示例。像这样嵌套 try/finally 子句有什么危险吗?
openDatabaseConnection();
try {
// Methods unrelated to cursor
// ...
String cursor_id = openCursor();
try {
useCursor(cursor_id);
} finally {
closeCursor(cursor_id);
}
// Methods unrelated to cursor
// ...
} catch (Exception e) {
genericLogError();
} finally {
closeDatabaseConnection();
}
具体来说,我很想知道 closeCursor()
是否保证在 closeDatabaseConnection()
之前被调用。嵌套 finally 子句是否应该被视为不良做法?
最佳答案
是的,这是有保证的。
假设在 useCursor(cursor_id)
期间发生了一些异常,现在 inner finally block 将被执行。 (因为异常发生在内部 try
block 中)。在此之后 genericLogError()
将被调用(因为异常发生在包含内部 try
的外部 try
中。并且只有在它之后 closeDatabasConnection()
将被执行(外部 try
的 finally
)。下面是一个图表,可能会更好地解释它:
(内层try异常→内层try的finally)→这被认为是外层try的异常→外层try的catch → 最终的外部尝试。
您可以通过从 block 中打印来测试它。
但为什么不这样做呢?
try {
useCursor(cursor_id);
} catch(Exception e) {
genericLogError();
} finally {
closeCursor(cursor_id);
closeDatabaseConnection();
}
关于java - 像这样嵌套 try/finally 子句安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473599/