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

173

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

Марко Леунг
источник

Ответы:

178

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

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

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

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

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

  • Error - Что-то достаточно серьезное пошло не так, что большинство приложений должно зависать, а не пытаться решить проблему,
  • Unchecked Exception (aka RuntimeException) - очень часто ошибка программирования, такая как NullPointerExceptionили недопустимый аргумент. Иногда приложения могут обрабатывать или восстанавливать данные из этой Throwableкатегории - или, по крайней мере, отлавливать их в run()методе Thread , регистрировать жалобу и продолжать работу.
  • Проверенное исключение (иначе все остальное) - ожидается, что приложения смогут улавливать и что-то значимо делать с остальными, такими как FileNotFoundExceptionи TimeoutException...
Эдди
источник
10
Оракул говорит это Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors, Я знаю, что возникает вопрос: является ли ошибка исключением? , но это то, что они пишут. Вот только один из этих примеров: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer
1
Оставшийся без ответа вопрос - чем отличаются RuntimeException и Error по существу? Оба непроверены и равны во всех отношениях.
Pacerier
38

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

Исключительная иерархия Java

avandeursen
источник
6
Я хотел бы видеть кого-то, восстанавливающегося после NullPointerException: D: D: D
Игнасио Солер Гарсия
2
@IgnacioSolerGarcia Это может быть и даже имеет смысл (другой вопрос, если это хорошо). Обычно вы проверяете, существует ли объект, и после этого вызываете метод или используете поле. Но вместо проверки существования вы можете попробовать поймать NPE. И записать сообщение об этом и продолжить, например.
Гангнус
@Gangnus: не имеет смысла. Помните, что исключение пропускает части кода и является способом сообщения об ошибках, а не о нормальных операциях
Игнасио Солер Гарсия
17

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

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

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

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

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

Робин
источник
Посмотрите examples.javacodegeeks.com/java-basics/exceptions/… как пример. IllegalArgumentException - исключение времени выполнения, а не ошибка. docs.oracle.com/javase/7/docs/api/java/lang/…
Гангнус
8

Ошибки -

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

Исключения -

  1. Exceptions в Java имеют тип java.lang.Exception.
  2. Exceptions включает как проверенный, так и непроверенный тип.
  3. Проверенные исключения известны компилятору, а непроверенные исключения не известны компилятору, поскольку они возникают во время выполнения.
  4. Вы можете восстанавливаться после исключений, обрабатывая их через try-catchблоки.
  5. Exceptions в основном вызваны самим приложением.
  6. Примеры: Проверили Исключение: SQLException, IOException
    Unchecked Исключение: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

дальнейшее чтение: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

roottraveller
источник
7

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

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

Powerlord
источник
3

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

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

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

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

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

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

Тобиас Мюллер
источник
2

Существует несколько сходств и различий между классами 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 и его диаграмма классов-наследников (свойства и методы опущены). введите описание изображения здесь

Михайлов Валентин
источник
1

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

Пример:

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

Мистер Уилл
источник
1

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

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

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

user2485429
источник
«Ошибки в основном вызваны средой, в которой запущено приложение» и «Исключения в основном вызваны самим приложением» отлично!
ADJ
0

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

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

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

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

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

egaga
источник
0

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

Примеры: VirtualMachineError - Брошенный, чтобы указать, что виртуальная машина Java сломана или исчерпала ресурсы, необходимые для ее продолжения работы. OutOfMemoryErrorпроисходит, когда JVM исчерпывает память или StackOverflowErrorпроисходит, когда стек переполняется.

Исключения вызваны вашим приложением или самой программой; возможно из-за вашей собственной ошибки. В большинстве случаев вы можете восстановить его, и ваше приложение все равно будет продолжать работать. Рекомендуется отлавливать такие ошибки, чтобы предотвратить ненормальное завершение работы вашего приложения или программы и / или иметь возможность настроить сообщение об исключении, чтобы пользователи увидели красиво отформатированное сообщение вместо стандартных некрасивых сообщений об исключениях, разбросанных повсеместно.

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

pasignature
источник