Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

  • Error - Произошла серьезная ошибка, поэтому большинство приложений должны аварийно завершить работу, вместо того чтобы попытаться решить проблему.
  • Непроверенное исключение (также известное как RuntimeException) - Очень часто возникает ошибка программирования, например NullPointerException или незаконный аргумент.Приложения иногда могут справиться с этим или восстановиться после этого. Throwable категория - или, по крайней мере, поймать ее в теме run() метод, зарегистрируйте жалобу и продолжайте работу.
  • Проверенное исключение (также известное как «Все остальное»). Ожидается, что приложения смогут перехватывать и осмысленно что-то делать с остальными, например: FileNotFoundException и TimeoutException...

Другие советы

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

Java Exception Hierarchy

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

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

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

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

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

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

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

Ошибки -

  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. Exceptionв основном вызваны самим приложением.
  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 класс совершенно ясен:

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

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top