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