Я пытаюсь узнать больше о базовой Java и разных типах Throwables, может ли кто-нибудь сообщить мне о различиях между исключениями и ошибками?
Различия между Исключением и ошибкой
Ответ 1
Ошибки не должны быть пойманы или обработаны (за исключением самых редких случаев). Исключения составляют хлеб и масло обработки исключений. Javadoc хорошо объясняет:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условия.
Посмотрите на несколько подклассов Error
, взяв некоторые из своих комментариев JavaDoc:
-
AnnotationFormatError
- Выбрасывается, когда парсер аннотации пытается прочитать аннотацию из файла класса и определяет, что аннотация неверна. -
AssertionError
- Брошено, чтобы указать, что утверждение не выполнено. -
LinkageError
- Подклассы LinkageError показывают, что класс имеет некоторую зависимость от другого класса; однако последний класс несовместимо изменился после компиляции прежнего класса. -
VirtualMachineError
- Брошено указывать, что виртуальная машина Java повреждена или у нее закончились ресурсы, необходимые для продолжения работы.
Существуют действительно три важные подкатегории Throwable
:
-
Error
- Что-то достаточно серьезное пошло не так, что большинство приложений должны сработать, а не попытаться решить проблему, - Unchecked Exception (aka
RuntimeException
) - Очень часто ошибка программирования, такая какNullPointerException
или незаконный аргумент. Приложения иногда могут обрабатывать или восстанавливать из этой категорииThrowable
- или, по крайней мере, улавливать ее при методе Threadrun()
, регистрировать жалобу и продолжать работу. - Проверено исключение (также как и все остальное). Ожидается, что приложения смогут поймать и осмысленно сделать что-то с остальными, например
FileNotFoundException
иTimeoutException
...
Ответ 2
Ошибки, как вы знаете, указывают на конец вашего приложения. Он обычно не может быть восстановлен и должен заставить вашу виртуальную машину выйти. Ловить их не следует, кроме как, возможно, журнала или отображения и соответствующего сообщения перед выходом.
Пример: OutOfMemoryError - мало что можно сделать, поскольку ваша программа больше не может работать.
Исключения часто восстанавливаются, и даже если нет, они обычно означают, что попытка не удалась, но ваша программа все еще может продолжать.
Пример: IllegalArgumentException. Передал недопустимые данные методу, чтобы вызов метода не удался, но он не влияет на будущие операции.
Это упрощенные примеры, и есть еще одна информация о только исключениях.
Ответ 3
Этот слайд, показывающий иерархию исключений Java @georgios-gousios, вкратце объясняет различия между ошибками и исключениями в 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 возникает, когда приложение пытается использовать несовместимые типы классов.
Ответ 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/