Вопрос
По разным причинам звоню System.exit
вызывает неодобрение при написании Приложения Java, итак, как я могу уведомить вызывающий процесс о том, что не все идет по плану?
Редактировать: Цифра 1 - это standin
для любого ненулевого кода выхода.
Решение
Использование System.exit
не одобряется, когда "приложение" на самом деле является подприложением (напримерservlet, апплет) более крупного Java-приложения (сервера):в этом случае System.exit
может остановить JVM и, следовательно, также все другие вспомогательные приложения.В этой ситуации наилучшим вариантом является создание соответствующего исключения, которое может быть перехвачено и обработано платформой приложения / сервером.
Если java-приложение действительно предназначено для запуска как отдельное приложение, нет ничего плохого в использовании System.exit
.в этом случае установка значения exit, вероятно, является самым простым (а также наиболее используемым) способом сообщения о сбое или успехе родительскому процессу.
Другие советы
Я согласен с "создать исключение- толпа.Одна из причин заключается в том, что вызов System.exit затрудняет использование вашего кода, если вы хотите, чтобы другой код мог его использовать.Например, если вы обнаружите, что ваш класс был бы полезен из веб-приложения или какого-то приложения, использующего сообщения, было бы неплохо предоставить этим контейнерам возможность каким-то образом справиться со сбоем.Контейнер может захотеть повторить операцию, решить войти в систему и проигнорировать проблему, отправить электронное письмо администратору и т.д.
Исключением из этого правила может стать ваш main()
способ;это может перехватить исключение и вызвать System.exit()
с некоторым значением, которое может быть распознано вызывающим процессом или сценарием оболочки.
System.exit()
заблокирует и создаст взаимоблокировку, если поток, который ее инициировал, используется в перехватчике завершения работы.
Это также может быть опасно / проблематично в средах веб-сервлетов.
Создание исключения обычно считается другой альтернативой.
Политика нашей компании заключается в том, что вызывать System.exit(-1) нормально (даже предпочтительно), но только в методах init().Я бы определенно дважды подумал, прежде чем вызывать его во время обычного выполнения программы.
Создание исключений - это лучший способ отправить информацию об определенной ошибке в приложение и из него.
Число говорит вам не так много, как:
Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"
(или что-то близкое к этому)
К этому относятся неодобрительно из-за Нормальный выходит.Если "не все идет по плану", то System.exit в порядке.
Обновить:Я должен добавить, что я предполагаю, что ваше '1' имеет значение, которое где-то задокументировано.
Я думаю, что создание исключения - это то, что вы должны делать, когда что-то идет не так.Таким образом, если ваше приложение не запущено как автономное, вызывающий абонент может отреагировать на это и получить некоторую информацию о том, что пошло не так.Это также проще для целей отладки, потому что вы также получаете лучшее представление о том, что пошло не так, когда видите трассировку стека.
Важно отметить одну вещь: когда исключение достигает верхнего уровня и, следовательно, приводит к завершению работы виртуальной машины, виртуальная машина возвращает код возврата, равный 1, поэтому внешние приложения, использующие код возврата, видят, что что-то пошло не так.
Единственный случай, когда я думаю, что System.exit() имеет смысл, - это когда ваше приложение предназначено для вызова приложениями, которые не являются Java, и поэтому должны использовать коды возврата, чтобы увидеть, сработало ли ваше приложение или нет, и вы хотите, чтобы у этих приложений была возможность по-разному реагировать на разные сбои, т.Е.вам нужны другие коды возврата.