Java 如果有,是否会到达最后一个区块;其中(对)“;试块中的块?
下面是令我困惑的代码:Java 如果有,是否会到达最后一个区块;其中(对)“;试块中的块?,java,try-catch-finally,Java,Try Catch Finally,下面是令我困惑的代码: public Integer getInteger(BlockingQueue<Integer> queue) { boolean interrupted = false; try { while (true) { try { return queue.take(); } catch (InterruptedException e) {
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();
}
}
public Integer getInteger(阻塞队列){
布尔值=假;
试一试{
while(true){
试一试{
返回队列。take();
}捕捉(中断异常e){
中断=真;
//失败并重试
}
}
}最后{
如果(中断)
Thread.currentThread().interrupt();
}
}
看起来try块不会因为While(true)块而停止,但我被告知finally块总是在try块结束后执行。那么什么时候执行finally块呢?如果有另一个异常不是由InterruptedException派生的那么当
try
块完成时,finally
块将执行,这可能有两个原因:
正常完成,这意味着它返回一个值,这会导致queue.take()
语句正常完成,并使用return
中的值从方法返回take()
通过抛出queue.take()
(或异常
)而不是错误
,突然完成中断异常
- 如果try块的执行正常完成,则执行finally块[…]
- 如果try块的执行由于抛出值V而突然完成,则有一个选择:
- 如果V的运行时类型与任何catch子句[…]的可捕获异常类的赋值兼容,则可以选择:
- 如果catch块正常完成,则执行finally块[…]
- 如果catch块由于原因R而突然完成,则执行finally块[…]
- 如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则执行finally块
- 如果V的运行时类型与任何catch子句[…]的可捕获异常类的赋值兼容,则可以选择:
- 如果try块的执行由于任何其他原因突然完成,则执行finally块[…]
简而言之,无论出于何种原因,
try
块完成时,始终执行finally
块。唯一不发生这种情况的方法是异常终止JVM(例如JVM死机、JVM崩溃、操作系统崩溃或断电)。如果在try
块中确实存在无限循环,我认为您不会到达finally
块。您的答案是正确的,但是我觉得他应该重新设计他的逻辑,使程序不依赖于异常,或者在没有异常的情况下queue.take()
导致返回。