Я пытаюсь узнать больше об основной Java и различных типах Throwable, может кто-нибудь сообщить мне разницу между исключениями и ошибками?
Я пытаюсь узнать больше об основной Java и различных типах Throwable, может кто-нибудь сообщить мне разницу между исключениями и ошибками?
Ответы:
Ошибки не должны быть пойманы или обработаны (за исключением редких случаев). Исключения - это хлеб с маслом обработки исключений. Javadoc объясняет это хорошо:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить. Большинство таких ошибок являются ненормальными условиями.
Посмотрите на некоторые из подклассов Error
, взяв некоторые из их комментариев JavaDoc:
AnnotationFormatError
- Выдается, когда анализатор аннотаций пытается прочитать аннотацию из файла класса и определяет, что аннотация искажена.AssertionError
- Брошенный, чтобы указать, что утверждение не удалось.LinkageError
- Подклассы LinkageError указывают, что класс имеет некоторую зависимость от другого класса; однако последний класс несовместимо изменился после компиляции первого класса.VirtualMachineError
- Брошенный, чтобы указать, что виртуальная машина Java сломана или исчерпала ресурсы, необходимые для ее продолжения работы. На самом деле есть три важные подкатегории Throwable
:
Error
- Что-то достаточно серьезное пошло не так, что большинство приложений должно зависать, а не пытаться решить проблему,RuntimeException
) - очень часто ошибка программирования, такая как NullPointerException
или недопустимый аргумент. Иногда приложения могут обрабатывать или восстанавливать данные из этой Throwable
категории - или, по крайней мере, отлавливать их в run()
методе Thread , регистрировать жалобу и продолжать работу.FileNotFoundException
и TimeoutException
...Этот слайд показывает иерархию исключений в Java с помощью @ Георгиос-gousios лаконично объясняет различия между ошибками и исключениями в Java.
Ошибки имеют тенденцию сигнализировать об окончании вашего приложения, как вы его знаете. Как правило, он не может быть восстановлен и должен привести к выходу вашей виртуальной машины. Поймать их не следует, за исключением возможности регистрации или отображения соответствующего сообщения перед выходом.
Пример: OutOfMemoryError - Вы мало что можете сделать, так как ваша программа больше не может работать.
Исключения часто восстанавливаемы, и даже если нет, они обычно означают, что попытка операции не удалась, но ваша программа все еще может продолжаться.
Пример: IllegalArgumentException - передал недопустимые данные в метод, так что вызов метода не удался, но это не влияет на будущие операции.
Это упрощенные примеры, и есть только много информации только об исключениях.
Ошибки -
Error
s в Java имеют тип java.lang.Error
.Error
происходит во время выполнения. Они не будут известны компилятору. Error
В основном это вызвано средой, в которой работает приложение. java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
s в Java имеют тип java.lang.Exception
.Exception
s включает как проверенный, так и непроверенный тип.try-catch
блоки.Exception
s в основном вызваны самим приложением.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
дальнейшее чтение: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
Солнце ставит это лучше всего :
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить.
Описание Error
класса довольно понятно:
An
Error
является подклассом,Throwable
который указывает на серьезные проблемы, которые разумное приложение не должно пытаться уловить. Большинство таких ошибок являются ненормальными условиями.ThreadDeath
Ошибка, хотя «нормальном» состоянии, также подклассError
, так как большинство приложений не должны пытаться поймать его.Метод не обязан объявлять в своем предложении throws любые подклассы,
Error
которые могут быть выброшены во время выполнения метода, но не перехвачены, так как эти ошибки являются ненормальными условиями, которые никогда не должны возникать.
Цитируется из собственной документацииError
Java этого класса .
Короче говоря, вы не должны ловить Error
s, кроме случаев, когда у вас есть на то веские причины. (Например, чтобы предотвратить сбой реализации веб-сервера, если сервлету не хватает памяти или что-то в этом роде.)
С Exception
другой стороны, это обычное исключение, как и в любом другом современном языке. Подробное описание вы найдете в документации по API Java или на любом онлайн или автономном ресурсе.
Существует несколько сходств и различий между классами 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 и его диаграмма классов-наследников (свойства и методы опущены).
ИМО ошибка - это то, что может привести к сбою приложения и не должно обрабатываться. Исключением является то, что может привести к непредсказуемым результатам, но может быть восстановлено.
Пример:
Если программе не хватает памяти, это ошибка, так как приложение не может продолжить работу. Однако, если программа принимает неправильный тип ввода, это исключение, поскольку программа может обработать его и перенаправить для получения правильного типа ввода.
Ошибки в основном вызваны средой, в которой работает приложение. Например, OutOfMemoryError возникает, когда JVM не хватает памяти, или StackOverflowError возникает, когда стек переполняется.
Исключения в основном вызваны самим приложением. Например, NullPointerException возникает, когда приложение пытается получить доступ к нулевому объекту, или ClassCastException возникает, когда приложение пытается привести несовместимые типы классов.
Вот довольно хорошее резюме из Java API, что представляет собой Ошибка и Исключение:
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» условием, также является подклассом Error, поскольку большинство приложений не должны пытаться ее перехватить.
Метод не обязан объявлять в своем предложении throws любые подклассы Error, которые могут быть выброшены во время выполнения метода, но не перехвачены, поскольку эти ошибки являются ненормальными условиями, которые никогда не должны возникать.
OTOH, для исключений, Java API говорит:
Класс Exception и его подклассы являются формой Throwable, которая указывает условия, которые разумное приложение может захотеть перехватить.
Ошибки вызваны средой, в которой работает ваше приложение или программа. В большинстве случаев вы не можете восстановиться после этого, поскольку это завершает ваше приложение или программу. Javadoc посоветовал вам не беспокоиться об обнаружении таких ошибок, так как среда, например JVM, при таких ошибках все равно будет выходить.
Примеры:
VirtualMachineError
- Брошенный, чтобы указать, что виртуальная машина Java сломана или исчерпала ресурсы, необходимые для ее продолжения работы.
OutOfMemoryError
происходит, когда JVM исчерпывает память или
StackOverflowError
происходит, когда стек переполняется.
Исключения вызваны вашим приложением или самой программой; возможно из-за вашей собственной ошибки. В большинстве случаев вы можете восстановить его, и ваше приложение все равно будет продолжать работать. Рекомендуется отлавливать такие ошибки, чтобы предотвратить ненормальное завершение работы вашего приложения или программы и / или иметь возможность настроить сообщение об исключении, чтобы пользователи увидели красиво отформатированное сообщение вместо стандартных некрасивых сообщений об исключениях, разбросанных повсеместно.
Примеры:
NullPointerException
происходит, когда приложение пытается получить доступ к нулевому объекту. или Попытка получить доступ к массиву с несуществующим индексом или вызвать функцию с неправильными данными или параметрами.
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
, Я знаю, что возникает вопрос: является ли ошибка исключением? , но это то, что они пишут. Вот только один из этих примеров: docs.oracle.com/javase/tutorial/essential/exceptions/… .