如果 try 块中有"Where (true)"块,是否会达到最终块?



这段代码让我很困惑:

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或电源丢失)。

相关内容

  • 没有找到相关文章

最新更新