Кто-нибудь, пожалуйста, объясните разницу между java.lang.RuntimeException
и java.lang.Exception
? Как я могу решить, какой из них следует расширить, если я создаю собственное исключение?
Разница между java.lang.RuntimeException и java.lang.Exception
Ответ 1
Обычно RuntimeExceptions исключения, которые могут быть предотвращены программно. Например, NullPointerException
, ArrayIndexOutOfBoundException
. Если вы проверите null
перед вызовом любого метода, NullPointerException
никогда не произойдет. Аналогично, ArrayIndexOutOfBoundException
никогда не произойдет, если вы сначала проверите индекс. RuntimeException
не проверяются компилятором, поэтому это чистый код.
EDIT. В наши дни люди предпочитают RuntimeException
, потому что чистый код, который он производит. Это полностью личный выбор.
Ответ 2
В Java существует два типа исключений: проверенные исключения и исключенные исключения. Проверенное исключение должно обрабатываться явно кодом, тогда как исключение без проверки не требуется явно обрабатывать.
Для отмеченных исключений вам нужно поставить блок try/catch вокруг кода, который потенциально может вызвать исключение, или добавить в метод предложение "throws", чтобы указать, что метод может вызывать этот тип исключения (например, которые должны обрабатываться в вызывающем классе или выше).
Любое исключение, происходящее из "Исключение", является проверенным исключением, тогда как класс, полученный из RuntimeException, не проверяется. RuntimeExceptions не нужно явно обрабатывать вызывающим кодом.
Ответ 3
Прежде чем смотреть на разницу между классами java.lang.RuntimeException
и java.lang.Exception
, вы должны знать иерархию Exception
. Оба класса Exception
и Error
выводятся из класса Throwable
(который происходит из класса Object
). И класс RuntimeException
выводится из класса Exception
.
Все исключения производятся либо из Exception
, либо RuntimeException
.
Все исключения, полученные из RuntimeException
, называются непроверенными исключениями. И все остальные исключения - это checked исключения. Проверенное исключение должно быть уловлено где-то в вашем коде, иначе оно не будет компилироваться. Вот почему они называются проверенными исключениями. С другой стороны, с непроверенными исключениями, вызывающий метод не обязан обрабатывать или объявлять его.
Поэтому все исключения, которые компилятор заставляет вас обрабатывать, непосредственно получены из java.lang.Exception
, а все остальные, которые компилятор не заставляет вас обрабатывать, получены из java.lang.RuntimeException
.
Ниже приведены некоторые из прямых известных подклассов RuntimeException.
AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException
Ответ 4
Исключено исключение, а исключение RuntimeException не отмечено.
Проверено означает, что компилятор требует, чтобы вы обрабатывали исключение в catch, или объявляете ваш метод как его бросание (или один из его суперклассов).
Как правило, бросать проверенное исключение, если ожидается, что вызывающий API-интерфейс обрабатывает исключение, и исключение без проверки, если это то, что обычно не может обработать вызывающий объект, например ошибка с одним из параметров, т.е. ошибка программирования.
Ответ 5
Класс исключений во время выполнения (RuntimeException и его подклассы) освобождаются от проверки времени компиляции, поскольку компилятор не может установить, что исключения во время выполнения не могут выполняться. (из JLS).
В классах, которые вы создаете, вы должны подклассы Exception и бросать экземпляры он сигнализирует о любых исключительных сценариях. Это означает, что вы будете клиенты вашего класса, что использование вашего класса может вызвать исключение, и они должны предпринять шаги для устранения этих исключительных сценариев.
Ниже фрагменты кода объясняют эту точку:
//Create your own exception class subclassing from Exception
class MyException extends Exception {
public MyException(final String message) {
super(message);
}
}
public class Process {
public void execute() {
throw new RuntimeException("Runtime");
}
public void process() throws MyException {
throw new MyException("Checked");
}
}
В приведенном выше классе определении класса Процесс метод execute
может
throw a RuntimeException, но в объявлении метода не нужно указывать, что
он выбрасывает RuntimeException.
Метод process
выдает исключенное исключение и должен объявить, что он
выкинет проверенное исключение вида MyException, и это не будет сделано
ошибка компиляции.
Указанное выше определение класса повлияет на код, который использует класс Process.
Вызов new Process().execute()
является действительным вызовом, где в качестве вызова формы
new Process().process()
дает ошибку компиляции. Это связано с тем, что клиентский код должен
предпринять шаги для обработки MyException
(например, вызов метода process() может быть заключен в
блок try/catch).
Ответ 6
Правильное использование RuntimeException?
Из Unchecked Exceptions - The Controversy:
Если клиент можно разумно ожидать восстановить из исключения, сделать это проверенное исключение. Если клиент не может ничего сделать, чтобы оправиться от исключение, сделать его непроверенным исключение.
Обратите внимание, что исключенное исключение - это событие, полученное из RuntimeException
, а проверенное исключение - это одно производное от Exception
.
Зачем бросать RuntimeException
, если клиент не может ничего сделать для восстановления из исключения? В статье объясняется:
Исключения во время выполнения представляют собой проблемы которые являются результатом программирования проблема, и как таковой, клиент API не может разумно ожидать, что оправиться от них или обработать их в так или иначе. К таким проблемам относятся: арифметические исключения, такие как деление на ноль; исключения указателя, например, попытки доступа к объекту через нулевую ссылку; и индексирование исключения, например, попытки доступ к элементу массива через слишком большой или слишком маленький индекс.
Ответ 7
Из документации оракула:
Вот руководство к нижней строке: если клиент может разумно ожидается, что он восстановится после исключения, сделайте это проверенным исключением. Если клиент не может ничего сделать для восстановления из исключения, сделайте его исключенное исключение.
Исключения времени выполнения представляют собой проблемы, которые являются результатом проблемы программирования, и как таковой, клиентский код API не может разумно ожидать, что он восстановит их или обработать их каким-либо образом.
RuntimeExceptions похожи на примеры исключений при использовании api примеров runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException
С Исключениями вы должны поймать его явно, потому что вы все еще можете что-то сделать для восстановления. Примеры исключений: IOException, TimeoutException, PrintException...
Ответ 8
RuntimeException - дочерний класс класса Exception
Это один из многих дочерних классов класса Exception. RuntimeException - суперкласс из тех исключений, которые могут быть выброшены во время нормальной работы виртуальной машины Java. Метод не обязан объявлять в своих предложениях throws любые подклассы RuntimeException, которые могут быть выбраны во время выполнения метода, но не пойманы.
Иероглиф
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
Ответ 9
Простыми словами, если ваш клиент/пользователь может восстановить из Exception, сделайте это Проверено Исключение, если ваш клиент не может ничего сделать, чтобы восстановить из Exception, а затем сделать его Unchecked RuntimeException. Например, исключение RuntimeException будет программной ошибкой, например делением на ноль, ни один пользователь не может ничего с этим поделать, кроме самого программиста, тогда это исключение RuntimeException.
Ответ 10
Исключения - хороший способ обработки неожиданных событий в потоке приложения. RuntimeException не отмечены компилятором, но вы можете предпочесть использовать исключения, которые расширяют класс исключений, чтобы управлять поведением ваших клиентов api, поскольку они должны ловить ошибки для их компиляции. Также формирует хорошую документацию.
Если вы хотите добиться чистого интерфейса, используйте наследование для подкласса различных типов исключений, которые имеет ваше приложение, а затем выставляют родительское исключение.
Ответ 11
Существует два типа исключения: вы можете восстановить исключенное исключение, если вы получаете такое исключение. Исключение в Runtime являются безвозвратными, исключения во время выполнения - это ошибки программирования, и программист должен позаботиться об этом во время написания кода, и продолжить выполнение этого может привести к некорректному результату. Исключения в Runtime - это нарушение пред. Условия ex. у вас есть массив размером 10, и вы пытаетесь получить доступ к 11-му элементу, он будет генерировать ArrayIndexOutOfBoundException