Ответы:
Обычно RuntimeExceptions - это исключения, которые можно предотвратить программным способом . Например NullPointerException
, ArrayIndexOutOfBoundException
. Если вы проверите null
перед вызовом любого метода, NullPointerException
никогда не произойдет. Подобного ArrayIndexOutOfBoundException
никогда не произойдет, если вы сначала проверите индекс. RuntimeException
не проверяются компилятором, поэтому это чистый код.
РЕДАКТИРОВАТЬ : В наши дни люди предпочитают, RuntimeException
потому что чистый код, который он производит. Это полностью личный выбор.
RuntimeException
заключается в том, что это просто и устраняет необходимость думать о различиях между проверенными и непроверенными исключениями. Я думаю, что ловить исключения во время выполнения - ужасная идея, потому что вы будете ловить неустранимые исключения, такие как NullPointerException
.
В Java есть два типа исключений: проверенные исключения и непроверенные исключения. Проверенное исключение должно быть явно обработано кодом, тогда как непроверенное исключение не требует явной обработки.
Для проверенных исключений вы должны либо поместить блок try / catch вокруг кода, который потенциально может вызвать исключение, либо добавить к методу «throws», чтобы указать, что метод может генерировать исключение такого типа (которое должно быть обрабатывается в классе вызова или выше).
Любое исключение, которое происходит от «Exception», является проверенным исключением, тогда как класс, который происходит от RuntimeException, не проверяется. Исключения RuntimeException не должны явно обрабатываться вызывающим кодом.
Прежде чем взглянуть на разнице между java.lang.RuntimeException
и java.lang.Exception
классами, вы должны знать Exception
иерархию. И классы, Exception
и Error
классы являются производными от класса Throwable
(который является производным от класса Object
). И класс RuntimeException
является производным от класса Exception
.
Все исключения являются производными от Exception
или RuntimeException
.
Все исключения, которые RuntimeException
являются производными, называются непроверенными исключениями. А все остальные исключения являются проверенными исключениями. Проверенное исключение должно быть зафиксировано где-то в вашем коде, иначе оно не скомпилируется. Вот почему они называются проверенными исключениями. С другой стороны, за непроверенными исключениями вызывающий метод не обязан обрабатывать или объявлять его.
Поэтому все исключения, которые компилятор заставляет вас обрабатывать, напрямую получены, 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
Исключение проверяется, а RuntimeException не проверяется.
Проверено означает, что компилятор требует, чтобы вы обрабатывали исключение в перехвате или объявляли ваш метод как выбрасывающий его (или один из его суперклассов).
Как правило, генерировать проверенное исключение, если ожидается, что вызывающий API обрабатывает исключение, и непроверенное исключение, если это то, что обычно не может обработать вызывающий объект, например ошибка с одним из параметров, то есть программирование. ошибка.
Классы исключений во время выполнения (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");
}
}
В приведенном выше определении класса класса Process метод execute
может вызвать исключение RuntimeException, но в объявлении метода не обязательно указывать, что оно вызывает исключение RuntimeException .
Метод process
генерирует проверенное исключение, и он должен объявить, что он сгенерирует проверенное исключение типа MyException и в противном случае это будет ошибка компиляции.
Приведенное выше определение класса также повлияет на код, который использует класс Process .
Вызов new Process().execute()
является допустимым вызовом, когда в качестве вызова формы
new Process().process()
выдается ошибка компиляции. Это связано с тем, что клиентский код должен предпринимать шаги для обработки MyException
(скажем, вызов метода () может быть заключен в блок try / catch).
Правильное использование RuntimeException?
Из непроверенных исключений - Спор :
Если разумно ожидать, что клиент восстановится после исключения, сделайте его проверенным исключением. Если клиент не может ничего сделать для восстановления из исключения, сделайте его непроверенным исключением.
Обратите внимание, что непроверенное исключение является производным, RuntimeException
а проверенное исключение - производным Exception
.
Зачем бросать, RuntimeException
если клиент не может ничего сделать для восстановления после исключения? Статья объясняет:
Исключения во время выполнения представляют проблемы, которые являются результатом программной проблемы, и поэтому нельзя ожидать, что клиентский код API будет восстанавливаться после них или обрабатывать их каким-либо образом. Такие проблемы включают арифметические исключения, такие как деление на ноль; исключения указателя, такие как попытка доступа к объекту через нулевую ссылку; и индексация исключений, таких как попытка доступа к элементу массива через индекс, который слишком велик или слишком мал.
Из документации оракула:
Вот практический совет: если разумно ожидать, что клиент восстановится после исключения, сделайте его проверенным исключением. Если клиент не может ничего сделать для восстановления из исключения, сделайте его непроверенным исключением.
Исключения во время выполнения представляют проблемы, которые являются результатом программной проблемы, и поэтому нельзя ожидать, что клиентский код API будет восстанавливаться после них или обрабатывать их каким-либо образом.
RuntimeExceptions похожи на «исключения из-за недопустимого использования API». Примеры runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException
С исключениями вы должны явно отловить это, потому что вы все равно можете что-то сделать для восстановления. Примеры исключений: IOException, TimeoutException, PrintException ...
Проще говоря, если ваш клиент / пользователь может восстановиться из Исключения, тогда сделайте его Проверенным Исключением , если ваш клиент ничего не может сделать, чтобы восстановить из Исключения, тогда сделайте его Непроверенным RuntimeException . Например, RuntimeException будет программной ошибкой, как деление на ноль, никто не может ничего с этим поделать, кроме самого программиста, тогда это RuntimeException .
RuntimeException является дочерним классом класса Exception
Это один из многих дочерних классов класса Exception. RuntimeException является суперклассом тех исключений, которые могут быть выброшены во время нормальной работы виртуальной машины Java. Метод не обязан объявлять в своем предложении throws любые подклассы RuntimeException, которые могут быть выброшены во время выполнения метода, но не перехвачены.
Иерархия
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
Исключения являются хорошим способом обработки непредвиденных событий в потоке приложения. RuntimeException не проверяется компилятором, но вы можете предпочесть использовать исключения, расширяющие класс исключений, для управления поведением ваших API-клиентов, так как они необходимы для перехвата ошибок для их компиляции. Также формирует хорошую документацию.
Если вы хотите добиться чистого интерфейса, используйте наследование для подкласса различных типов исключений, которые есть в вашем приложении, а затем предоставьте родительское исключение.
Существует два типа исключений. Вы можете восстановить после проверенного исключения, если вы получите такое исключение. Исключения во время выполнения безвозвратны, исключения во время выполнения - это ошибки программирования, и программист должен позаботиться об этом при написании кода, и дальнейшее выполнение этого может привести к неверному результату. Исключения во время выполнения касаются нарушения предварительных условий ex. у вас есть массив размером 10, и вы пытаетесь получить доступ к 11-му элементу, он выбросит ArrayIndexOutOfBoundException
Пользовательское исключение может быть проверенным или непроверенным, это зависит от класса, на который он распространяется.
Пользовательское исключение может быть пользовательской проверкой исключения, если оно распространяется на класс исключения.
Пользовательское исключение может быть пользовательским непроверенным исключением, если оно распространяется на класс исключений времени выполнения.
Определите класс и сделайте его дочерним для исключения или времени выполнения исключения