System.exit(num) или выбросить исключение RuntimeException из основного?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

static public void main() {
   try {
      runMyApp();
   } catch (Exception e) {
      System.exit(1);
   }
}

Ответ 3

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

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

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

Ответ 4

Сам APP должен использовать System.exit. Это его интерфейс с вызывающей средой (script). Любой внутренний компонент, конечно, должен использовать 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!");
}

Ответ 5

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

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

Ответ 6

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