System.exit (num) или выбросить RuntimeException из main? - PullRequest
16 голосов
/ 19 августа 2010

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

Ответы [ 6 ]

9 голосов
/ 19 августа 2010

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

РЕДАКТИРОВАТЬ: Я думаю, что я мог неправильно прочитать ваш вопрос.Я думал, что вы спрашиваете, когда вы хотите нормально выйти из JVM, но сигнализируете, что что-то идет не так, лучше ли выкинуть исключение или использовать System.exit.

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

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

7 голосов
/ 19 августа 2010

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

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

static public void main() {
   try {
      runMyApp();
   } catch (Exception e) {
      System.exit(1);
   }
}
3 голосов
/ 19 августа 2010

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

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

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

2 голосов
/ 19 августа 2010

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

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!");
}
0 голосов
/ 29 октября 2011

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

Бросок RuntimeException также может быть не лучшим вариантом, может подкласс, как упоминалось ранее, который является конкретным исключением приложения, может быть лучшим вариантом, на мой взгляд. -Manish

0 голосов
/ 19 августа 2010

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

...