Разница между java.lang.RuntimeException и java.lang.Exception - PullRequest
180 голосов
/ 03 февраля 2010

Кто-нибудь, пожалуйста, объясните разницу между java.lang.RuntimeException и java.lang.Exception? Как мне решить, какой из них расширить, если я создам собственное исключение?

Ответы [ 12 ]

165 голосов
/ 03 февраля 2010

В Java существует два типа исключений: проверенные исключения и непроверенные исключения. Проверенное исключение должно быть явно обработано кодом, в то время как не проверенное исключение не требует явной обработки.

Для проверенных исключений вы должны либо поместить блок try / catch вокруг кода, который потенциально может вызвать исключение, либо добавить к методу «throws», чтобы указать, что метод может вызвать исключение такого типа который должен обрабатываться в классе вызова или выше).

Любое исключение, которое происходит от «Exception», является проверенным исключением, тогда как класс, который происходит от RuntimeException, не проверяется. Исключения RuntimeException не должны явно обрабатываться вызывающим кодом.

147 голосов
/ 03 февраля 2010

Обычно RuntimeExceptions - это исключения , которые можно предотвратить программным путем. Например, NullPointerException, ArrayIndexOutOfBoundException. Если вы проверите null перед вызовом какого-либо метода, NullPointerException никогда не произойдет. Точно так же ArrayIndexOutOfBoundException никогда не произойдет, если вы сначала проверите индекс. RuntimeException не проверяются компилятором, поэтому это чистый код.

РЕДАКТИРОВАТЬ : В наши дни люди предпочитают RuntimeException за чистый код, который он производит. Это полностью личный выбор.

80 голосов
/ 24 июля 2011

Прежде чем смотреть на разницу между классами 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 
41 голосов
/ 03 февраля 2010

Исключение проверяется, а RuntimeException не проверяется.

Проверено означает, что компилятор требует, чтобы вы обработали исключение в перехвате или объявили свой метод как выбрасывающий его (или один из его суперклассов).

Обычно генерируется проверенное исключение, если ожидается, что вызывающий API обрабатывает исключение, и непроверенное исключение, если это то, что обычно не может обработать вызывающий, например, ошибка с одним изпараметры, т.е. ошибка программирования.

15 голосов
/ 03 февраля 2010

Классы исключений во время выполнения (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 может бросить RuntimeException , но объявление метода не должно указывать, что выдает RuntimeException .

Метод process выдает проверенное исключение, и он должен объявить, что он сгенерирует проверенное исключение вида MyException и не будет ошибка компиляции.

Приведенное выше определение класса повлияет на код, который также использует Process class.

Вызов new Process().execute() является действительным вызовом, где в качестве вызова формы new Process().process() выдает ошибку компиляции. Это потому, что код клиента должен принять меры для обработки MyException (скажем, вызов метода () может быть заключен в блок try / catch).

11 голосов
/ 02 ноября 2013

Правильное использование RuntimeException?

С Непроверенные исключения - Противоречие :

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

Обратите внимание, что непроверенное исключение - это одно из производных от RuntimeException, и проверенное исключениеодин из производных от Exception.

Зачем выбрасывать RuntimeException, если клиент не может ничего сделать для восстановления из исключения?В статье объясняется:

Исключения во время выполнения представляют проблемы, которые являются результатом программной проблемы, и поэтому нельзя ожидать, что клиентский код API будет восстанавливаться после них или обрабатывать их каким-либо образом.Такие проблемы включают арифметические исключения, такие как деление на ноль;исключения указателя, такие как попытка доступа к объекту через нулевую ссылку;и индексация исключений, таких как попытка доступа к элементу массива через индекс, который слишком велик или слишком мал.

4 голосов
/ 04 марта 2015

Проще говоря, если ваш клиент / пользователь может восстановиться после исключения, сделайте его Проверено Исключение , если ваш клиент не может ничего сделать для восстановления после исключения сделать это Не проверено RuntimeException . Например, RuntimeException будет программной ошибкой, как деление на ноль, никто не может ничего с этим поделать, кроме самого программиста, тогда это RuntimeException .

4 голосов
/ 22 октября 2013

Из документации оракула:

Вот основная рекомендация: если клиент может разумно ожидается восстановление после исключения, сделайте его проверенным исключением. Если клиент не может ничего сделать для восстановления после исключения, сделать его непроверенное исключение.

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

RuntimeExceptions похожи на «исключения из-за недопустимого использования API». Примеры runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException

С Исключениями вы должны явно отловить это, потому что вы все еще можете что-то сделать для восстановления. Примеры исключений: IOException, TimeoutException, PrintException ...

3 голосов
/ 08 мая 2014

RuntimeException является дочерним классом класса Exception

Это один из многих дочерних классов класса Exception. RuntimeException является суперклассом тех исключений, которые могут быть выброшены во время нормальной работы виртуальной машины Java. Метод не обязан объявлять в своем предложении throws любые подклассы RuntimeException, которые могут быть брошены во время выполнения метода, но не перехвачены.

Иерархия

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException

0 голосов
/ 09 апреля 2018
  1. Определяемое пользователем исключение может быть проверенным или непроверенным исключением, это зависит от класса, на который он распространяется.

  2. Пользовательское исключение может быть пользовательской проверкой исключения, если оно распространяется на класс исключения

  3. Пользовательское исключение может быть пользовательским непроверенным исключением, если оно распространяется на класс исключений времени выполнения.

  4. Определить класс и сделать его дочерним по отношению к Исключению или Исключению во время выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...