Как определить проверенные и непроверенные исключения в Java? - PullRequest
13 голосов
/ 10 марта 2010

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

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

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

Ответы [ 5 ]

18 голосов
/ 10 марта 2010

Все 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 является избыточной ).

5 голосов
/ 10 марта 2010

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

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

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

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

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

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

1 голос
/ 10 марта 2010

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

0 голосов
/ 12 сентября 2013
package practice;

import java.io.IOException;

class Practice
{
    public static void main(String args[])
    {
        Exception n=new NullPointerException();
        if(n instanceof RuntimeException)
        {
            System.out.println("this is a runtime(unchecked) exception");
        }
        else
        {
            System.out.println("this is not a compiletime(checked) exception");
        }

    }

}
0 голосов
/ 10 марта 2010

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

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

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

...