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()
    通过抛出
    异常
    (或
    错误
    )而不是
    中断异常
    ,突然完成
Java语言规范“”的缩写引用:

  • 如果try块的执行正常完成,则执行finally块[…]

  • 如果try块的执行由于抛出值V而突然完成,则有一个选择:

    • 如果V的运行时类型与任何catch子句[…]的可捕获异常类的赋值兼容,则可以选择:

      • 如果catch块正常完成,则执行finally块[…]

      • 如果catch块由于原因R而突然完成,则执行finally块[…]

    • 如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则执行finally块

  • 如果try块的执行由于任何其他原因突然完成,则执行finally块[…]

所有路径都指向“最终执行块”


简而言之,无论出于何种原因,
try
块完成时,始终执行
finally
块。唯一不发生这种情况的方法是异常终止JVM(例如JVM死机、JVM崩溃、操作系统崩溃或断电)。

如果在
try
块中确实存在无限循环,我认为您不会到达
finally
块。您的答案是正确的,但是我觉得他应该重新设计他的逻辑,使程序不依赖于异常,或者在没有异常的情况下
queue.take()
导致返回。