Как завершить программу с кодом выхода
Короткий ответ
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 — Завершает метод и возвращает значение вызывающему коду.