Различия между исключением и ошибкой - PullRequest
153 голосов
/ 26 мая 2009

Я пытаюсь узнать больше об основной Java и различных типах Throwable, может кто-нибудь сообщить мне разницу между исключениями и ошибками?

Ответы [ 10 ]

160 голосов
/ 26 мая 2009

Ошибки не должны быть пойманы или обработаны (за исключением редких случаев). Исключения - это хлеб с маслом обработки исключений. Javadoc объясняет это хорошо:

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

Посмотрите на некоторые из подклассов Error, взяв некоторые из их комментариев JavaDoc:

  • AnnotationFormatError - Выдается, когда анализатор аннотаций пытается прочитать аннотацию из файла класса и определяет, что аннотация искажена.
  • AssertionError - Выдается, чтобы указать, что утверждение не выполнено.
  • LinkageError - Подклассы LinkageError указывают, что класс имеет некоторую зависимость от другого класса; однако последний класс несовместимо изменился после компиляции первого класса.
  • VirtualMachineError - Брошенный, чтобы указать, что Виртуальная машина Java сломана или исчерпала ресурсы, необходимые для ее продолжения работы.

На самом деле есть три важные подкатегории Throwable:

  • Error - Что-то достаточно серьезное пошло не так, большинство приложений должно аварийно завершить работу, а не пытаться решить проблему,
  • Unchecked Exception (он же RuntimeException) - очень часто ошибка программирования, такая как NullPointerException или недопустимый аргумент. Иногда приложения могут обрабатывать или восстанавливать данные из этой категории Throwable или, по крайней мере, отлавливать ее в методе run() потока, регистрировать жалобу и продолжать работу.
  • Проверенное исключение (также как и все остальное) - ожидается, что приложения смогут улавливать и что-то значимо делать с остальными, например FileNotFoundException и TimeoutException ...
29 голосов
/ 24 октября 2016

Этот слайд, показывающий иерархию исключений Java от @ georgios-gousios , кратко объясняет различия между ошибками и исключениями в Java.

Java Exception Hierarchy

17 голосов
/ 26 мая 2009

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

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

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

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

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

7 голосов
/ 26 мая 2009

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

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

5 голосов
/ 15 сентября 2017

Ошибки -

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

Исключения -

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

3 голосов
/ 26 мая 2009

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

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

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

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

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

Exception, с другой стороны, является обычным исключением, как и в любом другом современном языке. Подробное описание вы найдете в документации по API Java или на любом онлайн или автономном ресурсе.

2 голосов
/ 04 мая 2016

Существует несколько сходств и различий между классами 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

1 голос
/ 26 мая 2009

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

Пример:

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

0 голосов
/ 27 апреля 2015

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

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

Источник: Разница между ошибкой и исключением в Java

0 голосов
/ 26 мая 2009

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

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

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

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

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

...