Будет ли блок catch подкласса перехватывать проверенное родительское исключение?

У меня есть метод с проверенным исключением для родительского класса, который может генерировать исключения типа parent и subclass

public void method() throws ParentException {
    if( false ) throw new ParentException();
    else if( true ) throw new ChildException(); // this one is thrown
}

и у меня есть каскадный блок catch, который сначала имеет дочернее исключение

try {
    method();
} catch (ChildException e) {
    // I get here?
} catch (ParentException e) {
    // or here?

}

Какой блок поймает выброшенное исключение? Поскольку метод явно объявляет только ParentException, будет ли ChildException показываться как экземпляр ParentException?

1 ответ

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

Я должен подчеркнуть, что ваши блоки catch должны быть в порядке иерархии наследования; то есть вы не можете объявить catch блокировать с ParentException с последующим ChildException, так как это ошибка компиляции. Что у вас там (с точки зрения catch блоки) действует.

Более распространенный вариант использования этого - при обработке файлового ввода-вывода; вы можете сначала поймать FileNotFoundException, затем IOException, если ошибка будет менее конкретной, чем FileNotFoundException,

Другие вопросы по тегам