Различия между исключением и ошибкой
Вопрос
Я пытаюсь узнать больше об основах Java и различных типах Throwables. Может ли кто-нибудь рассказать мне о различиях между исключениями и ошибками?
Решение
Ошибки не следует обнаруживать или обрабатывать (за исключением самых редких случаев).Исключения — это основа обработки исключений.А Javadoc хорошо объясняет:
Ошибка - это подкласс бросков, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.Большинство таких ошибок являются аномальными условиями.
Посмотрите на несколько подклассов Error
, взяв некоторые из их комментариев в JavaDoc:
AnnotationFormatError
— Выдается, когда анализатор аннотаций пытается прочитать аннотацию из файла класса и определяет, что аннотация имеет неправильный формат.AssertionError
- Брошен, чтобы указать, что утверждение не удалось.LinkageError
— Подклассы LinkageError указывают, что класс имеет некоторую зависимость от другого класса;однако последний класс несовместимо изменился после компиляции первого класса.VirtualMachineError
- Выдается, чтобы указать, что виртуальная машина Java неисправна или у нее закончились ресурсы, необходимые для продолжения работы.
На самом деле существует три важные подкатегории Throwable
:
Error
- Произошла серьезная ошибка, поэтому большинство приложений должны аварийно завершить работу, вместо того чтобы попытаться решить проблему.- Непроверенное исключение (также известное как
RuntimeException
) - Очень часто возникает ошибка программирования, напримерNullPointerException
или незаконный аргумент.Приложения иногда могут справиться с этим или восстановиться после этого.Throwable
категория - или, по крайней мере, поймать ее в темеrun()
метод, зарегистрируйте жалобу и продолжайте работу. - Проверенное исключение (также известное как «Все остальное»). Ожидается, что приложения смогут перехватывать и осмысленно что-то делать с остальными, например:
FileNotFoundException
иTimeoutException
...
Другие советы
Этот слайд, показывающий иерархию исключений Java к @georgios-gousios кратко объясняет различия между ошибками и исключениями в Java.
Ошибки, как правило, сигнализируют об окончании вашего приложения в том виде, в котором вы его знаете.Обычно его невозможно восстановить, и это должно привести к выходу вашей виртуальной машины.Перехватывать их не следует, за исключением возможной регистрации или отображения соответствующего сообщения перед выходом.
Пример:Ошибка OutOfMemoryError - Вы мало что можете сделать, поскольку ваша программа больше не может работать.
Исключения часто поддаются восстановлению, и даже если это не так, они обычно просто означают, что попытка выполнения операции не удалась, но ваша программа все равно может продолжать работу.
Пример:IllegalArgumentException — В метод переданы недопустимые данные, поэтому вызов метода не удался, но это не влияет на будущие операции.
Это упрощенные примеры, и есть еще много информации только об исключениях.
Солнце выражает это лучше всего:
Ошибка - это подкласс бросков, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.
Ошибки -
Error
s в Java имеют типjava.lang.Error
.- Все ошибки в Java непроверенного типа.
Error
Это происходит во время выполнения.Они не будут известны компилятору.- Восстановиться после ошибок невозможно.
Error
В основном они вызваны средой, в которой работает приложение.- Примеры :
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
s в Java имеют типjava.lang.Exception
.Exception
s включает как проверенный, так и непроверенный тип.- Проверенные исключения известны компилятору, тогда как непроверенные исключения не известны компилятору, поскольку они возникают во время выполнения.
- Вы можете восстановиться после исключений, обработав их через
try-catch
блоки. Exception
в основном вызваны самим приложением.- Примеры : Проверенные исключения:
SQLException
,IOException
Непроверенные исключения:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
дальнейшее чтение : http://javaconceptoftheday.com/difference-between-error-vs-Exception-in-java/
Описание Error
класс совершенно ясен:
Ан
Error
является подклассомThrowable
Это указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.Большинство таких ошибок ненормальные условия.ВThreadDeath
ошибка, хотя и "нормальное" условие, является также подклассError
потому что большинство приложения не должны пытаться поймать это.Метод не требуется для объявления в своем предложении о бросках любых подклассов
Error
Это может быть брошено во время выполнения метода, но не поймано, поскольку эти ошибки являются аномальными условиями, которые никогда не должны происходить.
Цитируется из собственного материала Java документация класса Error
.
Короче говоря, не стоит ловить Error
s, за исключением того, что у вас есть веская причина для этого.(Например, чтобы предотвратить сбой вашей реализации веб-сервера, если сервлету не хватает памяти или что-то в этом роде.)
Ан Exception
, С другой стороны, это обычное исключение, как и в любом другом современном языке.Подробное описание вы найдете в документации Java API или на любом онлайн- или офлайн-ресурсе.
Между классами есть несколько сходств и различий. java.lang.Exception
и java.lang.Error
.
Сходства:
Во-первых - оба класса расширяются
java.lang.Throwable
и в результате унаследовать многие из методов, которые являются общими для использования при работе с такими ошибками, как:getMessage
,getStackTrace
,printStackTrace
и так далее.Во-вторых, будучи подклассами
java.lang.Throwable
Они оба наследуют следующие свойства:Сам Throwable и любой из его подклассов (включая
java.lang.Error
) можно объявить в списке исключений метода, используяthrows
ключевое слово.Такое заявление требуется только дляjava.lang.Exception
и подклассы, дляjava.lang.Throwable
,java.lang.Error
иjava.lang.RuntimeException
и их подклассы необязательно.Только
java.lang.Throwable
и подклассы, разрешенные для использования вcatch
пункт.Только
java.lang.Throwable
и подклассы можно использовать с ключевым словом -throw
.
Вывод из этого свойства следует как java.lang.Error
и java.lang.Exception
может быть объявлен в заголовке метода, может быть в catch
предложение, может использоваться с ключевым словом throw
.
Отличия:
Первое - концептуальная разница:
java.lang.Error
Разработано для того, чтобы быть брошенным JVM и указывать на серьезные проблемы и намеревался остановить выполнение программы, а не быть пойманным (но это возможно, как и для любого другогоjava.lang.Throwable
преемник).Отрывок из Javadoc описание о
java.lang.Error
:... указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.
Напротив
java.lang.Exception
предназначен для представления ошибок, которые ожидали и могут быть обработаны программистом без прекращения выполнения программы.Отрывок из Javadoc описание о
java.lang.Exception
:... указывает условия, которые разумное приложение может захотеть поймать.
- Второе отличие между
java.lang.Error
иjava.lang.Exception
который сначала считался непроверенный исключение для проверки исключений во время компиляции.В результате выдачи кодаjava.lang.Error
или его подклассы не требуют объявлять эту ошибку в заголовке метода.бросаяjava.lang.Exception
необходимое объявление в заголовке метода.
Throwable и его диаграмма классов-преемников (свойства и методы опущены).
IMO, ошибка — это то, что может привести к сбою вашего приложения и не должно обрабатываться.Исключением является то, что может привести к непредсказуемым результатам, но может быть устранено.
Пример:
Если программе не хватает памяти, это ошибка, поскольку приложение не может продолжить работу.Однако если программа принимает неверный тип ввода, это исключение, поскольку программа может обработать его и перенаправить для получения правильного типа ввода.
Вот довольно хорошее резюме из Java API, что представляют собой ошибки и исключения:
Ошибка — это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить.Большинство таких ошибок являются ненормальными состояниями.Ошибка ThreadDeath, хотя и является «нормальным» состоянием, также является подклассом Error, поскольку большинству приложений не следует пытаться ее перехватить.
Метод не требуется для объявления в своем предложении о бросках любых подклассов ошибок, которые могут быть брошены во время выполнения метода, но не пойманные, поскольку эти ошибки являются аномальными условиями, которые никогда не должны происходить.
OTOH, для исключений, Java API говорит:
Класс Exception и его подклассы представляют собой форму Throwable, указывающую условия, которые разумное приложение может захотеть уловить.
Ошибки в основном вызваны средой, в которой работает приложение.Например, OutOfMemoryError возникает, когда JVM не хватает памяти, или StackOverflowError возникает, когда стек переполняется.
Исключения в основном вызваны самим приложением.Например, NullPointerException возникает, когда приложение пытается получить доступ к нулевому объекту, или ClassCastException возникает, когда приложение пытается привести несовместимые типы классов.
Источник : Разница между ошибкой и исключением в Java