System.exit()
может использоваться для запуска перехватчиков до выхода из программы. Это удобный способ для завершения работы в больших программах, где все части программы не могут (и не должны) знать друг о друге. Затем, если кто-то хочет выйти из системы, он может просто позвонить System.exit()
, а перехватчики завершения работы (если они правильно настроены) позаботятся о выполнении всех необходимых церемоний отключения, таких как закрытие файлов, освобождение ресурсов и т. Д.
«Этот метод никогда не возвращается нормально». просто означает, что метод не вернется; как только нить идет туда, она не вернется.
Другой, может быть, более распространенный способ выхода из программы - просто достичь конца main
метода. Но если запущены какие-либо потоки, не являющиеся демонами, они не будут закрыты, и, следовательно, JVM не выйдет. Таким образом, если у вас есть такие потоки, не являющиеся демонами, вам нужны другие средства (кроме ловушек завершения), чтобы закрыть все потоки, не являющиеся демонами, и освободить другие ресурсы. Если нет других потоков, не являющихся демонами, возврат из него main
отключит JVM и вызовет перехватчики завершения работы.
По некоторым причинам, перехватчики отключения кажутся недооцененным и неправильно понятым механизмом, и люди заново изобретают колесо с помощью всевозможных запатентованных пользовательских хаков для выхода из своих программ. Я хотел бы поощрять использование крюков отключения; все это есть в стандартной среде выполнения, которую вы будете использовать в любом случае.
Runtime.getRuntime().halt()
)В этом случае это не нужно. Никаких дополнительных потоков не будет запущено, вы не меняете код выхода (по умолчанию 0) - в основном это бессмысленно.
Когда в документах говорится, что метод никогда не возвращается нормально, это означает, что следующая строка кода фактически недоступна, даже если компилятор этого не знает:
Либо будет выдано исключение, либо виртуальная машина прекратит работу перед возвратом. Он никогда не "просто вернется".
Очень редко стоит звонить в
System.exit()
IME. Это может иметь смысл, если вы пишете инструмент командной строки и хотите указать ошибку с помощью кода выхода, а не просто выбросить исключение ... но я не могу вспомнить, когда в последний раз я использовал его в обычном рабочем коде ,источник
System.exit()
никогда не завершится нормально - он всегда завершится либо с исключением, либо с выключением виртуальной машины (что на самом деле не рассматривается в JLS).System.exit(0)
завершает JVM. В таких простых примерах трудно понять разницу. Параметр передается обратно в ОС и обычно используется для указания аварийного завершения (например, какой-то фатальной ошибки), поэтому, если вы вызвали java из командного файла или сценария оболочки, вы сможете получить это значение и получить представление если заявка была успешной.Это оказало бы большое влияние, если бы вы вызвали
System.exit(0)
приложение, развернутое на сервере приложений (подумайте об этом, прежде чем попробовать).источник
Метод никогда не возвращается, потому что это конец света, и следующий код не будет выполнен.
Ваше приложение в вашем примере будет в любом случае завершать работу в том же месте кода, но, если вы используете System.exit. у вас есть возможность вернуть пользовательский код в среду, например, скажем,
Кто будет использовать ваш код выхода? Скрипт, который вызывает приложение. Работает в Windows, Unix и других скриптовых средах.
Зачем возвращать код? Сказать что-то вроде «Мне не удалось», «База данных не ответила».
Чтобы узнать, как получить значение кода выхода и использовать его в сценарии оболочки Unix или сценарии Windows cmd, вы можете проверить этот ответ на этом сайте.
источник
В приложениях, которые могут иметь сложные ловушки завершения работы, этот метод не должен вызываться из неизвестного потока.
System.exit
никогда не завершается нормально, потому что вызов будет заблокирован до завершения JVM. Это похоже на то, что любой код, на котором выполняется отключение питания, прежде чем он сможет завершить работу. ВызовSystem.exit
будет инициировать перехватчики завершения программы и любой поток, который вызывает,System.exit
будет блокироваться до завершения программы. Это подразумевает, что, если хук завершения работы, в свою очередь, отправляет задачу потоку, из которогоSystem.exit
был вызван, программа будет заблокирована.Я обрабатываю это в моем коде с помощью следующего:
источник
Хотя ответ был действительно полезным, но кое-как он упустил некоторые дополнительные детали. Я надеюсь, что ниже поможет понять процесс завершения работы в Java, в дополнение к ответу выше:
PS: JVM может отключиться упорядоченным или резким образом.
источник
НИКОГДА не следует звонить
System.exit(0)
по этим причинам:Выход из программы «обычно» предоставляет тот же код выхода для операционной системы, что
System.exit(0)
и является избыточным.Если ваша программа не может выйти «нормально», вы потеряли контроль над своей разработкой [дизайном]. Вы должны всегда иметь полный контроль над состоянием системы.
Кстати: возврат кодов возврата, отличных от 0, имеет смысл, если вы хотите указать на ненормальное завершение программы.
источник
Нужен System.exit
В вашем случае он делает то же самое, что и простой возврат из основного.
источник
exit
на ваш единственный вариант.exit
. Не единственный вариант, но определенно стоит рассмотреть вариант.Спецификация языка Java говорит, что
Это означает, что вы должны использовать ее, когда у вас есть большая программа (ну, по крайней мере, больше, чем эта) и вы хотите закончить ее выполнение.
источник
Если в JVM запущена другая программа и вы используете System.exit, эта вторая программа также будет закрыта. Представьте, например, что вы выполняете задание Java на узле кластера и что Java-программа, которая управляет узлом кластера, выполняется в той же JVM. Если задание будет использовать System.exit, оно не только завершит задание, но и «завершит работу всего узла». Вы не сможете отправить другое задание на этот узел кластера, поскольку программа управления была случайно закрыта.
Поэтому не используйте System.exit, если вы хотите иметь возможность управлять своей программой из другой Java-программы в той же JVM.
Используйте System.exit, если вы хотите нарочно закрыть полную JVM и если вы хотите воспользоваться возможностями, описанными в других ответах (например, перехватчики завершения работы : перехват завершения работы Java , ненулевое возвращаемое значение для командной строки). звонки: Как получить статус выхода Java-программы в пакетном файле Windows ).
Также взгляните на исключения времени выполнения: System.exit (num) или выведите исключение времени выполнения из main?
источник