Альтернативы для System.exit (1) - PullRequest
19 голосов
/ 28 августа 2008

По различным причинам вызов System.exit вызывает недовольство при написании Java-приложений , так как я могу уведомить вызывающий процесс, что не все идет по плану?

Редактировать: 1 - это standin для любого ненулевого кода выхода.

Ответы [ 8 ]

25 голосов
/ 28 августа 2008

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

Если java-приложение действительно предназначено для запуска в качестве автономного приложения, в использовании System.exit нет ничего плохого. в этом случае установка значения выхода является, вероятно, самым простым (и также наиболее используемым) способом сообщения о неудаче или успехе родительскому процессу.

8 голосов
/ 28 августа 2008

Я согласен с толпой " выбросить исключение ". Одна из причин заключается в том, что вызов System.exit затрудняет использование вашего кода, если вы хотите, чтобы другой код мог его использовать. Например, если вы обнаружите, что ваш класс будет полезен из веб-приложения или какого-либо приложения, потребляющего сообщения, было бы неплохо предоставить этим контейнерам возможность как-то справиться с ошибкой. Контейнер может захотеть повторить операцию, принять решение о регистрации и игнорировании проблемы, отправить электронное письмо администратору и т. Д.

Исключением является ваш метод main(); это может перехватить исключение и вызвать System.exit() с некоторым значением, которое может быть распознано вызывающим процессом или сценарием оболочки.

3 голосов
/ 07 ноября 2013

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

1 голос
/ 29 августа 2008

Я думаю, что исключение - это то, что вы должны делать, когда что-то идет не так. Таким образом, если ваше приложение не работает как отдельное приложение, вызывающая сторона может отреагировать на него и получить некоторую информацию о том, что пошло не так. Это также легче для целей отладки, потому что вы также получите лучшее представление о том, что пошло не так, когда вы увидите трассировку стека.

Следует отметить одну важную вещь: когда исключение достигает верхнего уровня и, следовательно, заставляет ВМ выйти из ВМ, возвращается код возврата 1, поэтому внешние приложения, использующие этот код возврата, видят, что что-то пошло не так.

Единственный случай, когда я думаю, что System.exit () имеет смысл, это когда ваше приложение предназначено для вызова приложениями, которые не являются Java, и поэтому должны использовать коды возврата, чтобы увидеть, работает ли ваше приложение или нет, и вам нужны приложения, чтобы иметь возможность по-разному реагировать на разные вещи, например, вам нужны разные коды возврата.

1 голос
/ 28 августа 2008

Создание исключений - лучший способ отправить информацию об определенной ошибке из приложения.

Число не говорит вам столько, сколько:

Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"

(или что-то похожее)

1 голос
/ 28 августа 2008

Политика нашей компании заключается в том, что нормально (даже предпочтительнее) вызывать System.exit (-1), но только в методах init (). Я определенно подумал бы дважды, прежде чем вызывать его во время обычного потока программы.

1 голос
/ 28 августа 2008

Это также может быть опасно / проблематично в среде веб-сервлетов.

Бросок исключения обычно считается другой альтернативой.

1 голос
/ 28 августа 2008

Это не одобряется для нормальных выходов. Если «не все идет по плану», то System.exit в порядке.

Обновление: я должен добавить, что я полагаю, что ваше «1» имеет значение, которое где-то задокументировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...