Does a finally block always get executed in Java?

前端 未结 30 1549
逝去的感伤
逝去的感伤 2020-11-21 07:24

Considering this code, can I be absolutely sure that the finally block always executes, no matter what something() is?

try         


        
30条回答
  •  甜味超标
    2020-11-21 07:28

    Here's the official words from the Java Language Specification.

    14.20.2. Execution of try-finally and try-catch-finally

    A try statement with a finally block is executed by first executing the try block. Then there is a choice:

    • If execution of the try block completes normally, [...]
    • If execution of the try block completes abruptly because of a throw of a value V, [...]
    • If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
      • If the finally block completes normally, then the try statement completes abruptly for reason R.
      • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).

    The specification for return actually makes this explicit:

    JLS 14.17 The return Statement

    ReturnStatement:
         return Expression(opt) ;
    

    A return statement with no Expression attempts to transfer control to the invoker of the method or constructor that contains it.

    A return statement with an Expression attempts to transfer control to the invoker of the method that contains it; the value of the Expression becomes the value of the method invocation.

    The preceding descriptions say "attempts to transfer control" rather than just "transfers control" because if there are any try statements within the method or constructor whose try blocks contain the return statement, then any finally clauses of those try statements will be executed, in order, innermost to outermost, before control is transferred to the invoker of the method or constructor. Abrupt completion of a finally clause can disrupt the transfer of control initiated by a return statement.

提交回复
热议问题