Java中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, then the finally block is executed, and then there is a choice:

    • If the finally block completes normally, then the try statement completes normally.

    • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S.

  • If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:

    • If the run-time type of V is assignment compatible with a catchable exception class of any catch clause of the try statement, then the first (leftmost) such catch clause is selected. The value V is assigned to the parameter of the selected catch clause, and the Block of that catch clause is executed. Then there is a choice:

      • If the catch block completes normally, then the finally block is executed. Then there is a choice:

        • If the finally block completes normally, then the try statement completes normally.

        • If the finally block completes abruptly for any reason, then the try statement completes abruptly for the same reason.

      • If the catch block completes abruptly for 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).

    • If the run-time type of V is not assignment compatible with a catchable exception class of any catch clause of the try statement, then the finally block is executed. Then there is a choice:

      • If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.

      • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).

  • If execution of the try block completes abruptly for any other reason R, then the finally block is executed, and 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).

流程图

try-catch-finally执行流程图.png

参考文献

java8规范

你可能感兴趣的:(Java中try-catch-finally的执行流程)