这段代码让我很困惑:
public Integer getInteger(BlockingQueue<Integer> queue) {
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
interrupted = true;
// fall through and retry
}
}
} finally {
if (interrupted)
Thread.currentThread().interrupt();
}
}
看起来try块不会因为While(true)块而停止,但是我被告知finally块将总是在try块结束后执行。那么最后一个块什么时候执行呢?
当存在另一个不从InterruptedException派生的异常
finally
块将在try
块完成时执行,这在您的情况下可能有两个原因:
-
queue.take()
正常完成,即返回一个值,使return
语句正常完成,并从方法返回take()
的值。 -
queue.take()
突然完成,抛出Exception
(或Error
)而不是InterruptedException
。
Java语言规范"执行try-finally和try-catch-finally";
如果try块执行正常,则finally块执行[…]
如果try块的执行由于抛出值V而突然完成,则有一个选择:
如果V的运行时类型与任何catch子句的可捕获异常类的赋值兼容[…]还有一个选择:
如果catch块正常完成,则执行finally块[…]
如果catch块因R原因突然完成,则执行finally块[…]
如果V的运行时类型与try语句的任何catch子句的可捕获异常类的赋值不兼容,则执行finally块[…]
如果try块的执行由于任何其他原因突然完成R,则finally块被执行[…]
所有路径都指向"finally block is executed"
简而言之,finally
块无论出于何种原因,总是在try
块完成时执行。避免这种情况发生的唯一方法是JVM的异常终止(例如JVM kill、JVM crash、OS crash或电源丢失)。