Будет ли блок 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
,