Различия между Исключением и ошибкой
Я пытаюсь узнать больше о базовой Java и разных типах Throwables, может ли кто-нибудь сообщить мне о различиях между исключениями и ошибками?
Ответы
Ответ 1
Ошибки не должны быть пойманы или обработаны (за исключением самых редких случаев). Исключения составляют хлеб и масло обработки исключений. Javadoc хорошо объясняет:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условия.
Посмотрите на несколько подклассов Error
, взяв некоторые из своих комментариев JavaDoc:
-
AnnotationFormatError
- Выбрасывается, когда парсер аннотации пытается прочитать аннотацию из файла класса и определяет, что аннотация неверна.
-
AssertionError
- Брошено, чтобы указать, что утверждение не выполнено.
-
LinkageError
- Подклассы LinkageError показывают, что класс имеет некоторую зависимость от другого класса; однако последний класс несовместимо изменился после компиляции прежнего класса.
-
VirtualMachineError
- Брошено указывать, что виртуальная машина Java повреждена или у нее закончились ресурсы, необходимые для продолжения работы.
Существуют действительно три важные подкатегории Throwable
:
-
Error
- Что-то достаточно серьезное пошло не так, что большинство приложений должны сработать, а не попытаться решить проблему,
- Unchecked Exception (aka
RuntimeException
) - Очень часто ошибка программирования, такая как NullPointerException
или незаконный аргумент. Приложения иногда могут обрабатывать или восстанавливать из этой категории Throwable
- или, по крайней мере, улавливать ее при методе Thread run()
, регистрировать жалобу и продолжать работу.
- Проверено исключение (также как и все остальное). Ожидается, что приложения смогут поймать и осмысленно сделать что-то с остальными, например
FileNotFoundException
и TimeoutException
...
Ответ 2
Ошибки, как вы знаете, указывают на конец вашего приложения. Он обычно не может быть восстановлен и должен заставить вашу виртуальную машину выйти. Ловить их не следует, кроме как, возможно, журнала или отображения и соответствующего сообщения перед выходом.
Пример:
OutOfMemoryError - мало что можно сделать, поскольку ваша программа больше не может работать.
Исключения часто восстанавливаются, и даже если нет, они обычно означают, что попытка не удалась, но ваша программа все еще может продолжать.
Пример:
IllegalArgumentException. Передал недопустимые данные методу, чтобы вызов метода не удался, но он не влияет на будущие операции.
Это упрощенные примеры, и есть еще одна информация о только исключениях.
Ответ 3
Этот слайд, показывающий иерархию исключений Java @georgios-gousios, вкратце объясняет различия между ошибками и исключениями в Java.
![Иерархия исключений Java]()
Ответ 4
Sun ставит его лучше:
Ошибка - это подкласс Throwable что указывает на серьезные проблемы, которые разумное приложение не должно пытаться ловить.
Ответ 5
Описание класса Error
довольно понятно:
An Error
является подклассом Throwable
что указывает на серьезные проблемы, которые разумное приложение не должно пытаться ловить. Большинство таких ошибок ненормальные условия. ThreadDeath
ошибка, хотя "нормальное" условие, является также подкласс Error
, поскольку большинство приложения не должны пытаться поймать он.
Метод не требуется объявлять в его броски определяют любые подклассы Error
, которые могут быть выброшены во время выполнение метода, но не поймали, поскольку эти ошибки ненормальные условия, которые никогда не должны происходят.
Процитировано из Java документация класса Error
.
Короче говоря, вы не должны ловить Error
s, за исключением того, что у вас есть все основания для этого. (Например, чтобы не допустить, чтобы ваша реализация веб-сервера потерпела крах, если у сервлета закончилась нехватка памяти или что-то в этом роде.)
An Exception
, с другой стороны, является просто нормальным исключением, как на любом другом современном языке. Подробное описание вы найдете в документации по API Java или в любом онлайн-ресурсе или автономном ресурсе.
Ответ 6
Существует несколько сходств и различий между классами java.lang.Exception
и java.lang.Error
.
Сходства:
-
Сначала - оба класса расширяются java.lang.Throwable
и, как результат
наследует многие из методов, которые обычно используются при работе
с ошибками, такими как: getMessage
, getStackTrace
, printStackTrace
и
и так далее.
-
Во-вторых, как подклассы java.lang.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
, которое сначала считалось исключением unchecked для проверки исключения времени компиляции. Поскольку в результате преобразования кода java.lang.Error
или его подклассов не требуется объявлять эту ошибку в заголовке метода. При метании java.lang.Exception
требуемой декларации в заголовке метода.
Throwable и его диаграмма класса преемников (свойства и методы опущены).
![введите описание изображения здесь]()
Ответ 7
Здесь довольно хорошее резюме из Java API, что представляет собой Ошибка и Исключение:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является "нормальным" условием, также является подклассом Error, поскольку большинство приложений не должны пытаться ее поймать.
Метод не требуется объявлять в его броски определяют любые подклассы Ошибка, которая может быть выполнение метода, но не поймали, поскольку эти ошибки ненормальные условия, которые никогда не должны происходят.
OTOH, для исключений API Java говорит:
Класс Exception и его подклассы являются формой Throwable, которая указывает условия, которые разумное приложение может захотеть поймать.
Ответ 8
IMO ошибка - это то, что может привести к сбою вашего приложения и не должно быть обработано. Исключением является то, что может вызвать непредсказуемые результаты, но может быть восстановлено.
Пример:
Если у программы закончилась нехватка памяти, это ошибка, так как приложение не может продолжаться. Однако, если программа принимает неправильный тип ввода, это исключение, так как программа может обрабатывать его и перенаправлять на получение правильного типа ввода.
Ответ 9
Ошибки в основном вызваны средой, в которой работает приложение. Например, OutOfMemoryError возникает, когда у JVM заканчивается память или StackOverflowError возникает, когда переполнение стека.
Исключения в основном вызваны самим приложением. Например, NullPointerException возникает, когда приложение пытается получить доступ к нулевому объекту или ClassCastException возникает, когда приложение пытается использовать несовместимые типы классов.
Источник: Разница между ошибкой Vs Исключение в Java
Ответ 10
Ошибки -
-
Error
в java имеют тип java.lang.Error
.
- Все ошибки в java неконтролируемы.
-
Error
происходят во время выполнения. Они не будут известны компилятору.
- Исправить ошибки невозможно.
-
Error
в основном вызваны средой, в которой работает приложение.
- Примеры:
java.lang.StackOverflowError
, java.lang.OutOfMemoryError
Исключения -
-
Exception
в java имеют тип java.lang.Exception
.
-
Exception
включают как проверенные, так и непроверенные типы.
- Проверенные исключения известны компилятору, где, поскольку неконтролируемые исключения не известны компилятору, поскольку они возникают во время выполнения.
- Вы можете восстановить из-за исключения, обработав их через
try-catch
.
-
Exception
в основном вызваны самим приложением.
- Примеры: Проверенные исключения:
SQLException
, IOException
Непроверенные исключения: ArrayIndexOutOfBoundException
, ClassCastException
, NullPointerException
следующее чтение: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
![http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png]()