Различия между исключением и ошибкой

Я пытаюсь узнать больше о базовой 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.

Java Exception Hierarchy


ошибки, как правило, сигнализируют о конце вашего приложения, как вы его знаете. Обычно он не может быть восстановлен и должен привести к выходу вашей виртуальной машины. Поймать их не следует делать, кроме как, возможно, войти или отобразить и соответствующее сообщение перед выходом.

пример: Исключение OutOfMemoryError - не много вы можете сделать, так как ваша программа не может работать.

исключения часто восстанавливаются, и даже если нет, они обычно просто означают неудачную попытку операции, но ваша программа все еще может продолжаться.

пример: IllegalArgumentException - передал недопустимые данные методу, так что вызов метода не удался, но это не влияет на будущие операции.

это упрощенные примеры,и есть еще одно богатство информации только об исключениях.


Солнце ставит его лучше всего:

ошибка является подклассом Throwable это указывает на серьезные проблемы, которые разумное применение не должно пытаться ловить.


ошибки -

  1. Errors в java имеют тип java.lang.Error.
  2. все ошибки в java являются непроверенным типом.
  3. Errors происходит во время выполнения. Они не будут известны компилятору.
  4. невозможно восстановить от ошибок.
  5. Errors в основном вызваны средой, в которой работает приложение.
  6. примеры : java.lang.StackOverflowError, java.lang.OutOfMemoryError

исключения -

  1. Exceptions в java имеют тип java.lang.Exception.
  2. Exceptions включают как проверенный, так и непроверенный тип.
  3. проверенные исключения известны компилятору, где как непроверенные исключения не известны компилятору, потому что они происходят во время выполнения.
  4. вы можете восстановить из исключений, обрабатывая их через try-catch блоки.
  5. Exceptions в основном вызваны самим приложением.
  6. примеры : Проверенные Исключения : 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


описание Error класс вполне понятен:

An Error является наследником Throwable это указывает на серьезные проблемы, которые разумное применение не должно пытаться ловить. Большинство таких ошибок аномальные условия. The ThreadDeath ошибка, хотя и" нормальное " состояние, также подкласс Error потому что большинство приложения не должны пытаться поймать он.

метод не требуется объявлять в throws пункт любой подклассы Error Это может быть брошено во время выполнение метода, но не пойман, так как эти ошибки ненормальные условия, которые никогда не должны происходить.

цитируется из собственного Java документация класс Error.

короче говоря, вы не должны поймать Errors, за исключением того, что у вас есть веская причина сделать это. (Например, чтобы предотвратить сбой реализации веб-сервера, если у сервлета заканчивается память или что-то вроде что.)

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 и его диаграмма классов-преемников (свойства и методы опущены). enter image description here


IMO ошибка-это то, что может привести к сбою вашего приложения и не должно обрабатываться. Исключение-это то, что может вызвать непредсказуемые результаты, но может быть восстановлено.

пример:

Если у программы закончилась память, это ошибка, так как приложение не может продолжаться. Однако если программа принимает неверный тип ввода, это исключение, так как программа может обрабатывать его и перенаправлять для получения правильного типа ввода.


вот довольно хорошее резюме от Java API, что представляет собой ошибка и исключение:

ошибка-это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок-ненормальные условия. Ошибка ThreadDeath, хотя и является" нормальным " условием, также является подклассом ошибки, потому что большинство приложений не должны пытаться ее поймать.

метод не требуется объявлять в его броски клаузула любые подклассы Ошибка, которая может возникнуть во время выполнение метода, но не пойман, так как эти ошибки ненормальные условия, которые никогда не должны происходить.

OTOH, для исключений, Java API говорит:

исключение класса и его подклассы являются формой Throwable, которая указывает условия, которые разумное приложение может захотеть поймать.


ошибки в основном вызваны средой, в которой работает приложение. Например, OutOfMemoryError возникает, когда у JVM заканчивается память или StackOverflowError возникает при переполнении стека.

исключения в основном вызваны самим приложением. Например NullPointerException возникает, когда приложение пытается получить доступ к нулевому объекту или ClassCastException возникает, когда приложение пытается привести несовместимые типы классов.

источник : разница Между Ошибкой И Исключением В Java