Почему разрешено ловить подтип сгенерированного исключения в Java - PullRequest
2 голосов
/ 13 июня 2019

Я прочитал в книге по Java, что «Java не позволит вам объявить блок catch для проверенного типа исключения, который потенциально не может быть выдан телом класса try».

Это имеет смысл до сих пор.

Но теперь я спрашиваю себя, почему этот код компилируется:

    try {
        throw new Exception();
    } catch (IOException e) {
    } catch (Exception e) {
    }

Java позволяет мне ловить IOException, но, очевидно, он никогда не будет брошен блоком try.

Не нарушает ли этот пример правило, описанное в книге по Java?

Ответы [ 2 ]

6 голосов
/ 13 июня 2019

Java позволяет мне ловить исключение IOException, но, очевидно, оно никогда не будет быть брошенным блоком попытки.

Поскольку Exception является более общим, чем IOException, поэтому компилятор понимает, что Exception также может быть IOException.

Вот пример того, что произойдет, если вы попробуете NumberFormatException вместо Exception

try {
    throw new NumberFormatException();
} catch (IOException e) {  // fail
} catch (Exception e) {
}

Сбой, потому что NumberFormatException не является общим, чем IOException.

3 голосов
/ 13 июня 2019

Это очевидно для программиста, который читает этот код, но я предполагаю, что компилятор будет работать с оператором throw так же, как и с вызовом метода, объявленного как throwing Exception, и в этом случаеИсключением может быть IOException.

...