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

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

Ответ 1

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

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

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

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

Существуют действительно три важные подкатегории Throwable:

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

Ответ 2

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

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

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

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

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

Ответ 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 возникает, когда приложение пытается использовать несовместимые типы классов.

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

Ответ 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/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png