Различия между исключением и ошибкой
Я пытаюсь узнать больше о базовой Java и различных типах Throwables, может ли кто-нибудь сообщить мне о различиях между исключениями и ошибками?
10 ответов
ошибки не должны быть пойманы или обработаны (за исключением редких случаев). Исключения-это хлеб с маслом обработки исключений. The Javadoc объясняет это так:
ошибка-это подкласс Throwable, который указывает на серьезные проблемы, которые разумное применение не должно пытаться поймать. Большинство таких ошибок являются аномальными условия.
посмотрите на несколько подклассов Error
, принимая некоторые из их JavaDoc комментарии:
-
AnnotationFormatError
- выбрасывается, когда анализатор аннотаций пытается прочитать аннотацию из файла класса и определяет, что аннотация является неправильной. -
AssertionError
- брошенный, чтобы указать, что утверждение не удалось. -
LinkageError
- подклассы LinkageError указывают, что класс имеет некоторую зависимость от другого класса; однако последний класс несовместимо изменился после компиляции первого класса. -
VirtualMachineError
- брошено, чтобы указать, что виртуальная машина Java сломана или исчерпала ресурсы, необходимые для ее продолжения работы.
есть действительно три важные подкатегории Throwable
:
-
Error
- Что-то достаточно серьезное пошло не так большинство приложений должны разбиться, а не пытаться справиться с проблемой, - непроверенное исключение (он же
RuntimeException
) - очень часто ошибка программирования, такая какNullPointerException
или незаконный аргумент. Приложения иногда могут обрабатывать или восстанавливаться из этогоThrowable
категория -- или по крайней мере поймать его на нитиrun()
метод, зарегистрируйте жалобу и продолжайте работать. - проверено исключение (ака все остальное) - приложения, как ожидается, смогут поймать и осмысленно сделать что-то с остальными, например
FileNotFoundException
иTimeoutException
...
этой слайд, показывающий иерархию исключений Java by @georgios-gousios кратко объясняет различия между ошибками и исключениями в Java.
ошибки, как правило, сигнализируют о конце вашего приложения, как вы его знаете. Обычно он не может быть восстановлен и должен привести к выходу вашей виртуальной машины. Поймать их не следует делать, кроме как, возможно, войти или отобразить и соответствующее сообщение перед выходом.
пример: Исключение OutOfMemoryError - не много вы можете сделать, так как ваша программа не может работать.
исключения часто восстанавливаются, и даже если нет, они обычно просто означают неудачную попытку операции, но ваша программа все еще может продолжаться.
пример: IllegalArgumentException - передал недопустимые данные методу, так что вызов метода не удался, но это не влияет на будущие операции.
это упрощенные примеры,и есть еще одно богатство информации только об исключениях.
Солнце ставит его лучше всего:
ошибка является подклассом Throwable это указывает на серьезные проблемы, которые разумное применение не должно пытаться ловить.
ошибки -
-
Error
s в java имеют типjava.lang.Error
. - все ошибки в java являются непроверенным типом.
-
Error
s происходит во время выполнения. Они не будут известны компилятору. - невозможно восстановить от ошибок.
-
Error
s в основном вызваны средой, в которой работает приложение. -
примеры :
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/
описание Error
класс вполне понятен:
An
Error
является наследникомThrowable
это указывает на серьезные проблемы, которые разумное применение не должно пытаться ловить. Большинство таких ошибок аномальные условия. TheThreadDeath
ошибка, хотя и" нормальное " состояние, также подклассError
потому что большинство приложения не должны пытаться поймать он.метод не требуется объявлять в throws пункт любой подклассы
Error
Это может быть брошено во время выполнение метода, но не пойман, так как эти ошибки ненормальные условия, которые никогда не должны происходить.
цитируется из собственного Java документация класс Error
.
короче говоря, вы не должны поймать Error
s, за исключением того, что у вас есть веская причина сделать это. (Например, чтобы предотвратить сбой реализации веб-сервера, если у сервлета заканчивается память или что-то вроде что.)
An 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
Это первое, что считается unchecked исключение для проверки исключений во время компиляции. В результате код метанияjava.lang.Error
или его подклассы не требуют объявления этой ошибки в заголовке метода. При броскеjava.lang.Exception
обязательное объявление в заголовке метода.
Throwable и его диаграмма классов-преемников (свойства и методы опущены).
IMO ошибка-это то, что может привести к сбою вашего приложения и не должно обрабатываться. Исключение-это то, что может вызвать непредсказуемые результаты, но может быть восстановлено.
пример:
Если у программы закончилась память, это ошибка, так как приложение не может продолжаться. Однако если программа принимает неверный тип ввода, это исключение, так как программа может обрабатывать его и перенаправлять для получения правильного типа ввода.
вот довольно хорошее резюме от Java API, что представляет собой ошибка и исключение:
ошибка-это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок-ненормальные условия. Ошибка ThreadDeath, хотя и является" нормальным " условием, также является подклассом ошибки, потому что большинство приложений не должны пытаться ее поймать.
метод не требуется объявлять в его броски клаузула любые подклассы Ошибка, которая может возникнуть во время выполнение метода, но не пойман, так как эти ошибки ненормальные условия, которые никогда не должны происходить.
OTOH, для исключений, Java API говорит:
исключение класса и его подклассы являются формой Throwable, которая указывает условия, которые разумное приложение может захотеть поймать.
ошибки в основном вызваны средой, в которой работает приложение. Например, OutOfMemoryError возникает, когда у JVM заканчивается память или StackOverflowError возникает при переполнении стека.
исключения в основном вызваны самим приложением. Например NullPointerException возникает, когда приложение пытается получить доступ к нулевому объекту или ClassCastException возникает, когда приложение пытается привести несовместимые типы классов.
источник : разница Между Ошибкой И Исключением В Java