Все 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 много спорят об эффективности использования проверенных исключений по сравнению с непроверенными исключениями повсюду - предмет глубокого обсуждения в этом ответе.
РЕДАКТИРОВАТЬ 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
(например, он был пойман), то требуется только вторая часть из вышеприведенного «если» (например, проверка на Throwable является избыточной ).