Различия между временем выполнения / проверено / не проверено / ошибка / исключение - PullRequest
18 голосов
/ 02 июля 2010

Что такое исключения во время выполнения и что такое проверенные / непроверенные исключения и разница между ошибкой / исключением. Почему эти многие типы? Вместо этого Java может просто следовать простому дизайну (просто попробовать / перехватить все типы), чтобы обработать ненормальное состояние в программе?

Ответы [ 6 ]

30 голосов
/ 04 января 2015

Поскольку я являюсь новым Java-разработчиком, я также столкнулся с некоторыми трудностями при различении и работе с различными типами исключений. Вот почему я сделал короткую заметку на эту тему, и всякий раз, когда я запутался, я проходил через это. Вот оно с изображением иерархии классов Throwable:
Throwable Class Hierarchy

[Изображение предоставлено JavaTpoint ].

Здесь нужно запомнить три ключевых класса: Throwable, Exception и Error. Среди этих классов Exception можно разделить на два типа: «Проверенное исключение» и «Непроверенное исключение».

Проверено исключение:

  • Это классы, которые расширяют Throwable, за исключением RuntimeException и Error.
  • Они также известны как исключения времени компиляции, потому что они проверяются во время компиляции, что означает, что компилятор заставляет нас либо обрабатывать их с помощью try/catch, либо указывает в сигнатуре функции, что они throws, и заставляет нас иметь дело с их в звонилке.
  • Это программно исправимые проблемы, вызванные непредвиденными условиями, не зависящими от кода (например, сбой базы данных, ошибка ввода-вывода файла, неправильный ввод и т. Д.).
  • Пример: IOException, SQLException и т. Д.

Не проверено Исключение:

  • Классы, расширяющие RuntimeException, называются непроверенными исключениями.
  • Непроверенные исключения проверяются не во время компиляции, а во время выполнения, отсюда и название.
  • Они также являются программно восстанавливаемыми проблемами, но в отличие от проверенное исключение они вызваны ошибками в потоке кода или конфигурации.
  • Пример: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException и т. Д.
  • Поскольку они являются ошибками в программировании, их можно избежать путем грамотного / мудрого кодирования. Например, «деление на ноль» дает ArithmeticException, чего можно избежать, просто проверив делитель. Точно так же мы можем избежать NullPointerException, просто проверив ссылки: if (object != null) или даже используя лучшие методы .

Ошибка:

  • Error относится к безвозвратной ситуации, которая не обрабатывается try/catch.
  • Пример: OutOfMemoryError, VirtualMachineError, AssertionError и т. Д.

Почему так много типов?

В дополнение к ответу Stephen C я хочу сказать: обработка исключений - относительно дорогая операция в Java. Мы не должны помещать все исключительные ситуации в try/catch блок. Чрезмерное использование try/catch s может снизить производительность программы.

В заключение, Exception s следует обрабатывать программно, когда это возможно. С другой стороны, мы не можем обрабатывать Error с, так что это может быть несколько логических причин, по которым существует множество типов исключений.

29 голосов
/ 02 июля 2010

Throwable находится на вершине всех исключений.Под Throwable есть ошибка и исключение.Под Исключением у вас есть RuntimeException.

У Java есть два типа исключений - проверенные и непроверенные.Проверенные исключения применяются компилятором (вы должны объявить их в предложении throws и перехватить их в конце концов).Непроверенные исключения не применяются для перехвата или объявления в предложении throws.

(Спорная часть ответа)

Throwable существует, так что есть родитель для всех типов исключений.Вы никогда не должны объявлять, что вы бросаете Throwable и никогда не ловите его (если только вы действительно не знаете, что делаете).

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

Исключение существует как корень для всех ошибок, не связанных с программированием (см. RuntimeException для исключения из этого), например, файл не может бытьсоздан потому, что диск заполнен.Вы не должны бросать, бросать или ловить исключение.Если вам нужно перехватить Exception, убедитесь, что вы знаете, что делаете.

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

3 голосов
/ 02 июля 2010

Ответ TofuBeer четко объясняет, что означают классы исключений.

Почему так много типов? Вместо этого Java может просто следовать простому дизайну (просто попробовать / перехватить все типы) для обработки ненормальных условий в программе?

Почему? Потому что они необходимы! Без этих 4 классов обработка исключений по широкой категории была бы нецелесообразной.

  • Как бы вы ловили "все фатальные ошибки JVM" без класса Error?
  • Как бы вы перехватили «все исключения, которые не являются фатальными ошибками JVM» без Exception класса?
  • Как бы вы поймали "все непроверенные исключения" без класса RuntimeException?
1 голос
/ 31 августа 2015
  • Ошибка (выбрасывает ВМ, не должна быть поймана или обработана)
    1. Ошибка VM
    2. Ошибка подтверждения
    3. Ошибка связи ... и так далее
  • Runtime / Uncheck Exception (ошибка программирования, не должна быть перехвачена или обработана)
    1. NullPointerException
    2. ArrayIndexOutOfBoundException
    3. IllegalArgumentException ... и так далее
  • Проверка исключения (все остальное, ожидается, что приложения будут перехвачены или обработаны)
    1. IOException
    2. FileNotFoundException
    3. SQLException ... и так далее
0 голосов
/ 04 сентября 2018

Разница между проверенными и непроверенными исключениями:

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

Следует помнить следующее:

[1] Проверенное исключение означает Проверено компилятором Исключения .Это означает, что компилятор требует, чтобы такое исключение обрабатывалось блоком try-catch или ключевым словом throws.

[2] Непроверенные исключения - это те, для которых компилятор не предоставляет никакого мандата какони могут быть разрешены разработчиком путем кодирования / программирования, поскольку поток управления является управляемым, как в ArithmeticException, NullPointerException ArrayIndexOutOfBoundsException, IllegalArgumentException и т. д.

Я называю это «Exception-Identity-Test» гдеВы берете любое случайное исключение из документа Java и просто задаете ему один вопрос. «Эй, исключение!Можно ли решить программно? »

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

С другой стороны, если Исключение говорит Нет , тогда это Проверенное Исключение, как в проверенном Потоке управления Исключением выходит из нашего кода, как будто кто-то меняет пароли базы данных или кто-то отключает сетевой кабель, соединениетайм-аут (ConnectException), некоторый ресурс не найден (FileNotFoundException, ClassNotFound), SQLException, InvocatonTargetException и т. д. Эти проблемы не могут быть решены с помощью программирования

0 голосов
/ 02 июля 2010

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

...