如果有" Where(true)"是否会达到finally块。在try块中阻止?

时间:2015-10-22 02:01:53

标签: java try-catch-finally

这里的代码使我困惑:

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块何时执行?

2 个答案:

答案 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崩溃,操作系统崩溃或掉电)。