Как определить проверенные и неконтролируемые исключения в Java?

При чтении об исключении я буду всегда сталкиваться с контролируемыми исключительными ситуациями и неконтролируемыми исключениями, Так хотел знать, как отличить это, которое является что?

Править: Я хочу знать, создаю ли я какой-либо класс исключений затем, как я могу создать как проверенное или как непроверенное?

и каково значение каждого?

14
задан Md. Abu Nafee Ibna Zahid 19 March 2018 в 07:08
поделиться

4 ответа

Все Throwableы, кроме подклассов java.lang.RuntimeException или java.lang.Error, проверяются. Правильно, в Java "исключения" являются подклассами java.lang.Exception, "ошибки" являются подклассами java.lang.Error, а java.lang.Throwable обычно не подклассифицируется напрямую.

Программы не должны создавать свои собственные подклассы Error (хотя документация довольно двусмысленна по этому поводу), поэтому обычно вы всегда создаете Exceptions, используя RuntimeException, если вы не хотите, чтобы это проверялось.

Чтобы узнать во время выполнения, есть ли у вас проверяемое исключение, вы можете использовать:

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
    // this is a checked Exception
    }

Проверяемое исключение - это такое исключение, которое должно либо обрабатываться в предложении catch, либо объявляться как бросаемое в сигнатуре метода; компилятор следит за этим. Как правило, проверяемые исключения используются для исключений, которые должны обрабатываться вызывающим кодом, а непроверяемые исключения используются для условий, которые являются результатом ошибки программирования и должны быть исправлены путем корректировки кода.

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

EDIT 2012-10-23: В ответ на комментарии (которые вполне справедливы), чтобы уточнить, следующее, что требуется для определения того, является ли захваченный Throwable проверенным Throwable в отличие от проверенного Exception:

if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
    // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
    }

Если известно, что рассматриваемый объект является экземпляром Throwable (например. например, он был пойман), необходима только вторая часть вышеприведенного "if" (например, проверка на Throwable является избыточной).

18
ответ дан 1 December 2019 в 12:38
поделиться

Если класс исключения является подклассом RuntimeException , оно не проверяется и не должно быть объявлено для функций или перехвачено и т. Д. Ошибки исключения также не нужно объявлять / перехватывать. Вы об этом спрашиваете?

1
ответ дан 1 December 2019 в 12:38
поделиться

См. Спецификацию языка Java, глава 11 :

Непроверенные классы исключений - это класс RuntimeException и его подклассы, а также класс Ошибка и его подклассы. Все остальные классы исключений - это проверенные классы исключений. API Java определяет ряд классов исключений, как отмеченных, так и непроверенных. Дополнительные классы исключений, как отмеченные, так и непроверенные, могут быть объявлены программистами.

Вы можете проверить это с помощью instanceof во время выполнения, хотя я не совсем понимаю, где это может быть полезно.

Что касается второй части вашего вопроса:

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

  • непроверенное исключение представляет собой неожиданное состояния ошибки и указывают на ненормальное состояние вашей программы из-за недопустимого ввода, ошибок или ограничений времени выполнения (например, памяти); компилятор не заставит программиста обрабатывать их, то есть вам нужно заботиться о них только в том случае, если вы знаете об их возникновении

5
ответ дан 1 December 2019 в 12:38
поделиться

Совершенно уверен, что об этом уже спрашивали и отвечали, но для справки, это достаточно хорошо описано здесь: http://www.javapractices.com/topic/TopicAction.do?Id=129.

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

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

0
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: