System.exit (num) или выбросить RuntimeException из main?

У меня есть однопоточное приложение, которое должно установить уровень ошибки DOS на ненулевое значение, если есть проблема. Лучше бросить RuntimeException или использовать System.exit (ненулевой)? Мне не нужна трассировка стека, и я не ожидаю, что это приложение будет расширено / повторно использовано. В чем различия между этими двумя параметрами?

17
задан VarV 18 August 2010 в 23:50
поделиться

5 ответов

Не бросайте исключение, если у вас действительно нет исключительных условий. System.exit(int) существует именно по этой причине. Используйте его.

EDIT: Думаю, я неправильно понял ваш вопрос. Я думал, что вы спрашиваете, когда вы хотите выйти из JVM нормально, но сигнализируете, что что-то не совсем правильно, лучше ли бросить исключение или использовать System.exit.

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

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

10
ответ дан 30 November 2019 в 14:05
поделиться

Сам APP должен использовать System.exit. Это его интерфейс с вызывающей средой (скриптом). Любой внутренний компонент, конечно, должен использовать Exception. Когда вы соберете их вместе, это может быть и то и другое:

Application.main(...) {
  parse(args);
  check(...);
  try {
    MyObject o = ...;
    o.doMyStuff();
  } catch (Exception e) {
    System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld
    System.exit(ERROR_CODE);
  }
  System.out.println("Worked!");
}
2
ответ дан 30 November 2019 в 14:05
поделиться

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

Чтобы подвести итог, вызывайте System.exit только в обработчике исключений верхнего уровня:

static public void main() {
   try {
      runMyApp();
   } catch (Exception e) {
      System.exit(1);
   }
}
7
ответ дан 30 November 2019 в 14:05
поделиться

Выброшенное исключение распечатает трассировку стека, и если вам это не нужно, вы должны использовать System.exit.

После выхода вы можете проинформировать пользователя с помощью Sytem.out (я предполагаю, что приложение работает только в среде командной строки).

Вам следует подумать о том, чтобы просто вылавливать все ошибки и регистрировать ошибки в отдельном журнале, это гарантирует, что трассировка стека не будет потеряна навсегда при закрытии терминала. Взгляните на log4j для этой цели, он действительно прост в использовании.

3
ответ дан 30 November 2019 в 14:05
поделиться

System.exit() не рекомендуется. Она выключает JVM.

-4
ответ дан 30 November 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: