Кто-то, пожалуйста, объясните разницу между java.lang.RuntimeException
и java.lang.Exception
? Как мне решить, какой из них расширить, если я создам собственное исключение?
210
Обычно 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 .
источник
Исключение проверяется, а RuntimeException не проверяется.
Проверено означает, что компилятор требует, чтобы вы обрабатывали исключение в перехвате или объявляли ваш метод как выбрасывающий его (или один из его суперклассов).
Как правило, генерировать проверенное исключение, если ожидается, что вызывающий API обрабатывает исключение, и непроверенное исключение, если это то, что обычно не может обработать вызывающий объект, например ошибка с одним из параметров, то есть программирование. ошибка.
источник
Классы исключений во время выполнения (RuntimeException и его подклассы) освобождаются от проверки во время компиляции, поскольку компилятор не может установить, что исключения во время выполнения не могут возникнуть. (из JLS).
В разработанных вами классах вы должны создавать подкласс Exception и генерировать его экземпляры, чтобы сигнализировать о любых исключительных сценариях. При этом вы будете явно сигнализировать клиентам вашего класса о том, что использование вашего класса может вызвать исключение, и они должны предпринять шаги для обработки этих исключительных сценариев.
Ниже фрагменты кода объясняют этот момент:
В приведенном выше определении класса класса Process метод
execute
может вызвать исключение RuntimeException, но в объявлении метода не обязательно указывать, что оно вызывает исключение RuntimeException .Метод
process
генерирует проверенное исключение, и он должен объявить, что он сгенерирует проверенное исключение типа MyException и в противном случае это будет ошибка компиляции.Приведенное выше определение класса также повлияет на код, который использует класс Process .
Вызов
new Process().execute()
является допустимым вызовом, когда в качестве вызова формыnew Process().process()
выдается ошибка компиляции. Это связано с тем, что клиентский код должен предпринимать шаги для обработкиMyException
(скажем, вызов метода () может быть заключен в блок try / catch).источник
Правильное использование RuntimeException?
Из непроверенных исключений - Спор :
Обратите внимание, что непроверенное исключение является производным,
RuntimeException
а проверенное исключение - производнымException
.Зачем бросать,
RuntimeException
если клиент не может ничего сделать для восстановления после исключения? Статья объясняет:источник
Из документации оракула:
Исключения во время выполнения представляют проблемы, которые являются результатом программной проблемы, и поэтому нельзя ожидать, что клиентский код 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
источник
Пользовательское исключение может быть проверенным или непроверенным, это зависит от класса, на который он распространяется.
Пользовательское исключение может быть пользовательской проверкой исключения, если оно распространяется на класс исключения.
Пользовательское исключение может быть пользовательским непроверенным исключением, если оно распространяется на класс исключений времени выполнения.
Определите класс и сделайте его дочерним для исключения или времени выполнения исключения
источник