Метод System.exit() в Java - Вопросы

Всего: 6 вопросов

1. 

Для чего используется метод System.exit() в Java?

Метод System.exit() используется для завершения программы: он останавливает виртуальную машину Java (JVM) вместе со всеми её потоками. Метод принимает одно значение типа int — код завершения (exit code): 0 означает успешное завершение, любое ненулевое значение сообщает операционной системе об ошибке.

2. 

Как работает System.exit() изнутри и возвращает ли он управление вызвавшему коду?

Вызов System.exit(status) — это сокращение для Runtime.getRuntime().exit(status). Метод запускает процедуру завершения JVM: сначала выполняются все зарегистрированные shutdown hooks (обработчики завершения), затем виртуальная машина останавливается и возвращает ОС переданный код. System.exit() никогда не возвращает управление в вызвавший код — все операторы после вызова не будут выполнены, независимо от глубины вызовов.

3. 

Чем код завершения 0 отличается от кода 1?

Для JVM разницы нет — программа завершится в обоих случаях. Разница в смысле кода для операционной системы: 0 означает успешное завершение, 1 (и любое другое ненулевое значение) — завершение с ошибкой. По коду завершения внешние shell-скрипты, CI-серверы и планировщики задач определяют, успешно ли отработала программа. В Unix-подобных системах хранится только младший байт, поэтому осмысленный диапазон значений — от 0 до 255.

4. 

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

Нет. System.exit() останавливает JVM без разматывания стека вызовов, поэтому блоки finally и код после try-catch не выполняются. Выполнятся только зарегистрированные shutdown hooks. Это популярный вопрос на собеседованиях: ресурсы, которые вы рассчитывали закрыть в finally, останутся незакрытыми.

5. 

В чём разница между System.exit() и return, и когда System.exit() лучше не использовать?

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

6. 

Чем System.exit() отличается от Runtime.halt()?

System.exit() запускает штатную процедуру завершения: сначала выполняются shutdown hooks, затем JVM останавливается. Runtime.getRuntime().halt() останавливает JVM мгновенно, не выполняя shutdown hooks. halt() применяют в крайних случаях, например если штатная процедура завершения зависла.

Страница 1 из 1