Метод System.exit() в Java - Вопросы
Всего: 6 вопросов
1. Для чего используется метод System.exit() в Java?
Для чего используется метод System.exit() в Java?
Метод System.exit() используется для завершения программы: он останавливает виртуальную машину Java (JVM) вместе со всеми её потоками. Метод принимает одно значение типа int — код завершения (exit code): 0 означает успешное завершение, любое ненулевое значение сообщает операционной системе об ошибке.
2. Как работает System.exit() изнутри и возвращает ли он управление вызвавшему коду?
Как работает System.exit() изнутри и возвращает ли он управление вызвавшему коду?
Вызов System.exit(status) — это сокращение для Runtime.getRuntime().exit(status). Метод запускает процедуру завершения JVM: сначала выполняются все зарегистрированные shutdown hooks (обработчики завершения), затем виртуальная машина останавливается и возвращает ОС переданный код. System.exit() никогда не возвращает управление в вызвавший код — все операторы после вызова не будут выполнены, независимо от глубины вызовов.
3. Чем код завершения 0 отличается от кода 1?
Чем код завершения 0 отличается от кода 1?
Для JVM разницы нет — программа завершится в обоих случаях. Разница в смысле кода для операционной системы: 0 означает успешное завершение, 1 (и любое другое ненулевое значение) — завершение с ошибкой. По коду завершения внешние shell-скрипты, CI-серверы и планировщики задач определяют, успешно ли отработала программа. В Unix-подобных системах хранится только младший байт, поэтому осмысленный диапазон значений — от 0 до 255.
4. Выполнится ли блок finally после вызова System.exit()?
Выполнится ли блок finally после вызова System.exit()?
Нет. System.exit() останавливает JVM без разматывания стека вызовов, поэтому блоки finally и код после try-catch не выполняются. Выполнятся только зарегистрированные shutdown hooks. Это популярный вопрос на собеседованиях: ресурсы, которые вы рассчитывали закрыть в finally, останутся незакрытыми.
5. В чём разница между System.exit() и return, и когда System.exit() лучше не использовать?
В чём разница между System.exit() и return, и когда System.exit() лучше не использовать?
return завершает только текущий метод и возвращает управление вызвавшему коду — программа продолжает работать. System.exit() завершает всю программу: останавливаются все потоки, JVM выгружается из памяти. Вызывать System.exit() не стоит в веб-приложениях и серверном коде (остановит весь сервер), в библиотеках (лучше выбросить исключение) и в юнит-тестах (завершит процесс тестового раннера). В обычной логике для выхода из метода используйте return, а об ошибках сообщайте исключениями.
6. Чем System.exit() отличается от Runtime.halt()?
Чем System.exit() отличается от Runtime.halt()?
System.exit() запускает штатную процедуру завершения: сначала выполняются shutdown hooks, затем JVM останавливается. Runtime.getRuntime().halt() останавливает JVM мгновенно, не выполняя shutdown hooks. halt() применяют в крайних случаях, например если штатная процедура завершения зависла.