Разница между java.lang.RuntimeException и java.lang.Exception

210

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

cchampion
источник

Ответы:

181

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

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

fastcodejava
источник
10
Мне нравится этот угол "исключений во время выполнения мог избежать вызывающего абонента". Это означает, что вы (как вызывающий метод) должны быть уверены, что они даже не произойдут. Принимая во внимание, что проверенные исключения - это то, чего вы не можете избежать, и вместо этого они должны иметь дело с ними после факта. (И да, поскольку не все согласны с концепцией проверенных исключений и многие люди используют RuntimeException для всего, это различие стало немного запутанным).
Тило
4
В настоящее время люди предпочитают и непроверенную исключение RuntimeException, поскольку оно совместимо с лямбда-обработкой Java 8, а проверенные исключения типа Exception - нет.
Хартмут П.
2
Я подозреваю, что настоящая причина, по которой люди ловят, RuntimeExceptionзаключается в том, что это просто и устраняет необходимость думать о различиях между проверенными и непроверенными исключениями. Я думаю, что ловить исключения во время выполнения - ужасная идея, потому что вы будете ловить неустранимые исключения, такие как NullPointerException.
Донал
186

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

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

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

Энди Уайт
источник
3
Практически верно, что «есть два типа исключений», но почему в документации Oracle говорится, что есть три типа. Он считает Ошибка 3-м типом. Я думаю, что Ошибка вовсе не является исключением, она просто Throwable (объект), да, она имитирует поведение исключений во время выполнения. Что бы вы сказали по этому поводу? Oracle Doc. ссылка docs.oracle.com/javase/tutorial/essential/exceptions/…
Асиф Шахзад
3
Ошибка не предназначена для обнаружения (хотя это может быть), обычно вы используете ошибки для обнаружения ваших собственных ошибок, когда вы работаете над новым кодом. Например, если у вас есть дерево, если оператор if / elseif, последний оператор else может просто выбросить Error («не ожидал, что это условие произойдет») ;. Вообще говоря, исключения имеют случаи использования, когда они ДОЛЖНЫ происходить, тогда как ошибки не имеют варианта использования и являются ошибкой.
Дэнни
5
Но шутка в том, что RunTimeException сама по себе расширяет Exception: D (я знаю, что это не создает никаких проблем, и JVM заботится обо всем контексте)
Алиреза Мохамади
94

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

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

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

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

Лоуренс Дол
источник
15

Классы исключений во время выполнения (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).

Sateesh
источник
13

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

Из непроверенных исключений - Спор :

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

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

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

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

Махди Эсмаейли
источник
5

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

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

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

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

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

iberck
источник
4

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

Джо Алмор
источник
3

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

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

Иерархия

java.lang.Object

--- java.lang.Throwable

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

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

jayrhd
источник
0

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

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

FOO
источник
0

Существует два типа исключений. Вы можете восстановить после проверенного исключения, если вы получите такое исключение. Исключения во время выполнения безвозвратны, исключения во время выполнения - это ошибки программирования, и программист должен позаботиться об этом при написании кода, и дальнейшее выполнение этого может привести к неверному результату. Исключения во время выполнения касаются нарушения предварительных условий ex. у вас есть массив размером 10, и вы пытаетесь получить доступ к 11-му элементу, он выбросит ArrayIndexOutOfBoundException

Бхагвати Малав
источник
0
  1. Пользовательское исключение может быть проверенным или непроверенным, это зависит от класса, на который он распространяется.

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

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

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

Адитья
источник