Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как завершить программу с кодом выхода

Короткий ответ

System.exit(code) завершает программу сразу. Код 0 означает успех, любой другой — ошибку:

void main() {
    String[] files = {};
    if (files.length == 0) {
        IO.println("Nothing to process");
        System.exit(2);
    }
    IO.println("Processing...");
}

Результат:

Nothing to process

Код выхода смотрят в оболочке: в bash — echo $?, в PowerShell — $LASTEXITCODE. Здесь он равен 2.

Обычный выход

Если код выхода 0, System.exit() не нужен: достаточно выйти из main через return:

void main() {
    int[] items = {1, 2, 3};
    if (items.length > 0) {
        IO.println("Found " + items.length + " items");
        return;
    }
    IO.println("Not reached");
}

Результат:

Found 3 items

Код при исключении

Необработанное исключение в main тоже завершает программу, и код выхода будет 1. Выход по ошибке нагляднее с понятным сообщением в System.err:

void main() {
    try {
        Integer.parseInt("abc");
    } catch (NumberFormatException e) {
        System.err.println("Bad number: " + e.getMessage());
        System.exit(1);
    }
}

Результат:

Bad number: For input string: "abc"

Действия перед выходом

addShutdownHook() регистрирует код, который выполнится при любом нормальном завершении, в том числе через System.exit():

void main() {
    Runtime.getRuntime().addShutdownHook(new Thread(() -> IO.println("Saving state...")));
    IO.println("Working");
    System.exit(0);
}

Результат:

Working
Saving state...

Частая ошибка

Вызывать System.exit() глубоко внутри методов. Он останавливает всю JVM: блоки finally не выполняются, тесты обрываются, а в веб-сервере падает всё приложение. Лучше бросить исключение и решать, завершаться ли, только в main.

Функции из этого ответа

  • System.exit() — Немедленно завершает программу с заданным кодом выхода.
  • Runtime.getRuntime() — Возвращает объект Runtime текущей JVM: память, число процессоров, обработчики завершения.
  • return — Завершает метод и возвращает значение вызывающему коду.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.