System.exit (0) в Java - PullRequest
       31

System.exit (0) в Java

10 голосов
/ 16 апреля 2010

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

Ответы [ 5 ]

11 голосов
/ 16 апреля 2010

Как правило, вызов System.exit(...) в любом месте, кроме «основного» метода приложения, может быть проблематичным по (как минимум) по следующим причинам.

  • Это препятствует повторному использованию вашего кода.

  • Это затрудняет юнит-тестирование. Например, если ваш код вызывает System.exit, когда ваши тесты JUnit выполняют некоторую обработку ошибок, то это конец вашей тестовой последовательности!

Особый случай вызова System.exit(...) в прослушивателе кнопки для кнопки «выход» не так уж и плох. Вы вряд ли захотите повторно использовать прослушиватель кнопок где-то, что также не требует такого поведения. Кроме того, вы, вероятно, можете найти обходной путь для головоломки модульного тестирования; например не тестируйте этот метод отдельно!

Тем не менее, я думаю, что я все еще пытаюсь заставить выход произойти другим способом. Например, метод main запускает все, а затем блокирует CountDownLatch, а затем слушатель кнопки уменьшает защелку. Когда метод main разблокируется, он выполняет соответствующий код завершения работы и при необходимости возвращает или завершает работу.

6 голосов
/ 16 апреля 2010

Personnaly, я считаю наилучшей практикой позволить приложению завершать работу самостоятельно: если вы напишите основной класс с main(String[] args), с пустым кодом, его запуск будет завершен без вывода сообщений из Java-программы.

Но, в большинстве случаев, как и большинство разработчиков, я полагаюсь на System.exit(/<em>an exit code</em>/), особенно для приложений Swing, где Swing EDT будет работать бесконечно, как писал justkt . Известный недостаток этого Метод заключается в том, что большая часть кода приложения не вызывается, чего я избегаю, устанавливая ловушку отключения, вызывая <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)" rel="nofollow noreferrer">Runtime.addShutdownHook(Thread)</a>, что позволит мне очистить приложение (закрыть потоки и т. д.).

3 голосов
/ 16 апреля 2010

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

Это наиболее полезно, например, если вы пишете программу, предназначенную для запуска из сценария оболочки.

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

3 голосов
/ 16 апреля 2010

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

Но когда вам не нужен конкретный код (или 0 в порядке), я бы предпочел, чтобы JVM завершал «естественным образом», что происходит, когда не осталось больше потоков (не демонов).

Обычно вы бы просто достигли конца основного метода.

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

Если вы знаете об этих темах, вы обычно можете изящно завершить их. Если вы не знаете, какие потоки запущены в вашей программе, у вас есть большие проблемы ...

2 голосов
/ 16 апреля 2010

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

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

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