Выполнится ли блок `finally`, если в `try` или `catch` вызвать `System.exit()`?

«Выполнится ли блок `finally`, если в `try` или `catch` вызвать `System.exit()`?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, блок finally не выполнится.

Причина: Вызов System.exit(int status) немедленно завершает работу виртуальной машины Java (JVM). Этот процесс останавливает все потоки, включая тот, в котором должен был выполняться блок finally.

Пример, демонстрирующий это поведение:

public class FinallyAndSystemExit {
    public static void main(String[] args) {
        try {
            System.out.println("Внутри try-блока");
            System.exit(0); // JVM завершается здесь
        } catch (Exception e) {
            System.out.println("Внутри catch-блока");
        } finally {
            // Этот код НИКОГДА не выполнится
            System.out.println("Внутри finally-блока");
        }
        System.out.println("После try-catch-finally");
    }
}

Вывод программы:

Внутри try-блока

Важное исключение: Если System.exit() вызывается внутри блока catch или try, но до этого JVM уже запустила shutdown hook (хуки завершения), то эти shutdown hooks будут выполнены. Однако блок finally текущего try-catch выполнен не будет.