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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ошибки –

  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 составляют главным образом сами приложения.
  6. Примеры: Проверенные исключения: SQLException , IOException
    Unchecked Exceptions: ArrayIndexOutOfBoundException , ClassCastException , NullPointerException

далее: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

Существует несколько сходств и различий между classами java.lang.Exception и java.lang.Error .

сходства:

  • Сначала – оба classа расширяют java.lang.Throwable и, как результат, наследуют многие из методов, которые обычно используются при работе с такими ошибками, как getMessage , getStackTrace , getStackTrace и т. Д.

  • Во-вторых, как подclassы java.lang.Throwable они наследуют следующие свойства:

    • Сбрасывание самого себя и любого из его подclassов (включая java.lang.Error ) можно объявить в списке исключений методов, используя ключевое слово throw. Такое объявление требуется только для java.lang.Exception и подclassов для java.lang.Throwable , java.lang.Error и java.lang.RuntimeException и их подclassов является необязательным.

    • Только java.lang.Throwable и подclassы разрешены для использования в предложении catch .

    • Только java.lang.Throwable и подclassы могут использоваться с ключевым словом – 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 или его подclassы, не требует объявления этой ошибки в заголовке метода. При бросании java.lang.Exception требуется объявление в заголовке метода.

Throwable и диаграмма его преемника (свойства и методы опущены). введите описание изображения здесь

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

Пример:

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

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

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

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

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

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

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

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

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

  • Почему исключения следует использовать консервативно?
  • Ловить несколько исключений сразу?
  • Хорошие шаблоны для обработки ошибок VBA
  • java.sql.SQLException: Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: YES)
  • Как заставить WinForms молча игнорировать необработанные исключения?
  • Почему бы не поймать общие исключения
  • C ++: обрабатывать ресурсы, если конструкторы могут генерировать исключения (ссылка на часто задаваемые вопросы 17.4)
  • Почему C ++ STL iostreams не «исключение»?
  • Java - Что вызывает исключение IOException
  • Как использовать try catch для обработки исключений - лучшая практика
  • Puzzling Enumerable.Cast InvalidCastException
  • Interesting Posts

    как динамически объявлять массив объектов с конструктором в c ++

    Подождите, пока ActiveWorkbook.RefreshAll закончит – VBA

    Как укоротить отображение символов для текущего каталога в приглашении

    Android Share Intent для растрового изображения – возможно ли сохранить его ранее?

    Как создать алфавитную полосу прокрутки, отображающую всю букву в android?

    Как предотвратить закрытие приложения при закрытии формы запуска?

    Можно ли запустить материнскую плату в дистиллированной воде?

    Скопируйте файлы из ресурсов / StreamingAssets в Application.persistentDataPath после установки

    Каков способ Scala для реализации повторного вызова, подобного этому?

    Excel 2003 в соответствии со значениями ячейки должен быть связан с разными листами

    Печать реверса любой строки без использования какой-либо предопределенной функции?

    Как программировать круглые углы и задавать произвольные фоновые цвета

    Есть ли что-то вроде общего списка в Cocoa / Objective-C?

    В чем смысл этой части кода? void (* signal (int sig, void (* func) (int))) (int);

    Как изменить «Открыть с помощью Powershell» на «Открыть с помощью командной строки», когда shift-rightclicking в Explorer?

    Давайте будем гением компьютера.