这里的代码使我困惑:
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)块而停止,但我被告知最后块将始终在try块结束后执行。那么finally块何时执行?
答案 0 :(得分:4)
当有另一个异常不是从InterruptedException派生时
答案 1 :(得分:4)
finally
块将在try
块完成时执行,在您的情况下可能有两个原因:
queue.take()
正常完成,这意味着它返回一个值,导致return
语句正常完成,并从方法返回take()
的值。queue.take()
通过抛出除Exception
以外的Error
(或InterruptedException
)而突然完成。Java语言规范的缩写引用&#34; Execution of try-finally and try-catch-finally&#34;:
如果尝试块的执行正常完成,则执行 finally块 [...]
如果由于抛出值V而暂时执行try块 ,则可以选择:
如果V的运行时类型与任何catch子句 [...] 的可捕获异常类兼容,那么可以选择:
如果catch块正常完成,则执行 finally块 [...]
如果catch块突然因为原因R而完成,那么<strong> finally块将被执行 [...]
如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则执行 finally块 [。 ..]
如果由于任何其他原因导致执行try块突然完成,则执行 finally块 [...]
< / LI>
所有路径都会导致&#34;最后块被执行&#34;。
简而言之,finally
块在try
块完成时始终执行,无论出于何种原因。唯一不会发生这种情况的方法是JVM异常终止(例如JVM终止,JVM崩溃,操作系统崩溃或掉电)。