Как работает метод System.exit() в Java и когда его следует использовать?

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

Ответ

System.exit(int status) — это статический метод, который принудительно завершает работу виртуальной машины Java (JVM).

Параметр status (код завершения):

  • 0 — указывает на успешное (нормальное) завершение программы.
  • Любое ненулевое значение (часто 1 или -1) — сигнализирует об аварийном завершении из-за ошибки.

Ключевое поведение:

  • Немедленно останавливает все потоки выполнения.
  • Не гарантирует вызов деструкторов (finalize()) объектов.
  • Блоки finally и shutdown hooks выполняются. Это распространённое заблуждение. finally выполнится, если exit() вызван внутри соответствующего try блока. Shutdown hooks, добавленные через Runtime.addShutdownHook(), также будут запущены.

Пример с finally и shutdown hook:

public class ExitExample {
    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Shutdown hook executed.");
        }));

        try {
            System.out.println("Before exit.");
            System.exit(0);
        } finally {
            // Этот блок ВЫПОЛНИТСЯ, так как находится в том же методе, что и exit().
            System.out.println("Finally block executed.");
        }
        // Вывод:
        // Before exit.
        // Finally block executed.
        // Shutdown hook executed.
    }
}

Области применения:

  1. Консольные утилиты (CLI): Для возврата кода успеха/ошибки в операционную систему или скрипт-оболочку.
  2. Критические ошибки: Когда дальнейшая работа приложения невозможна (например, не удалось загрузить критическую конфигурацию).

Альтернативы (часто предпочтительнее):

  • Нормальное завершение: Простое достижение конца метода main() или возврат из него.
  • Исключения: Использование механизма исключений для обработки ошибок и управления потоком выполнения.