Не является ли непроверенное исключение, попавшее в блок try, проверенным исключением в Java? - PullRequest
8 голосов
/ 27 июня 2009

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

Ответы [ 3 ]

13 голосов
/ 27 июня 2009

Непроверенные исключения - это исключения, которые не нужно перехватывать в блоке try - catch. Непроверенные исключения являются подклассами классов RuntimeException или Error.

Проверенные исключения - это исключения, которые необходимо перехватить в блоке try - catch.

Определение проверенных и непроверенных исключений можно найти в Раздел 11.2: Проверка исключений во время компиляции из Спецификация языка Java :

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

Только то, что непроверенное исключение перехвачено в блоке catch, не делает его проверенным исключением - это просто означает, что непроверенное исключение было перехвачено и было обработано в блоке catch.

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

Например, NumberFormatException, который может быть выброшен при обработке некоторого непонятного String в методе Integer.parseInt, является непроверенным исключением, поэтому его не нужно перехватывать. Однако метод, вызывающий этот метод, может захотеть, чтобы его вызывающая сторона должным образом обработала такую ​​проблему, поэтому он может вызвать другое исключение, которое проверено (не подкласс RuntimeException.):

public int getIntegerFromInput(String s) throws BadInputException {
    int i = 0;
    try {
        i = Integer.parseInt(s);
    catch (NumberFormatException e) {
        throw new BadInputException();
    }

    return i;
}

В приведенном выше примере NumberFormatException перехватывается в блоке try - catch, и выдается новый BadInputException (который должен быть проверенным исключением).

Любой вызывающий метод getIntegerFromInput будет вынужден поймать BadInputException и вынужден иметь дело с неверными данными. Если бы NumberFormatException не должен был быть перехвачен и обработан, любой вызывающий этот метод должен был бы правильно обработать исключение.

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

Из учебников по Java:

4 голосов
/ 27 июня 2009

Нет, это не называется проверенным исключением только потому, что оно перехвачено. Блок перехвата может быть написан для перехвата любых исключений или ошибок. Проверенные исключения - это те исключения, на которые распространяется требование Catch или Specify , что означает, что вы обязаны либо перехватить их, либо заявить, что ваш метод может их выбросить. Вы можете думать, что термин флажок означает, что компилятор проверит, чтобы убедиться, что вы придерживаетесь улова или задаете требование. Ошибки и RuntimeExceptions называются непроверенными исключениями, поскольку компилятор не применяет к ним это требование.

1 голос
/ 27 июня 2009

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

Непроверенные исключения не требуют объявления или отлова, но ни одно из них не запрещено. Компилятор просто не идентифицирует их как ошибки.

...