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