Встречный вопрос: Что , если directThrow()
был каким-то образом изменен, чтобы не вызывать исключение? Как должен код обрабатывать это?
Чтобы проиллюстрировать эту проблему, вот пример:
class Foo {
int throwSomething() {
throw new RuntimeException();
}
}
class Bar extends Foo{
int throwSomething() {
return 1; // hahaaa, we don't throw but return normally
}
}
См? Подкласс переопределяет базовый метод и возвращает что-то, как теперь должен обрабатывать код:
int indirectThrowing(Foo foo) {
foo.throwSomething();
}
Если мы передадим new Foo()
, он сгенерирует ожидаемый результат, но если мы передадим new Bar()
, он просто вернет 1
. И таким образом это не подведет.
Чтобы преодолеть эту проблему, вы должны написать инструкцию возврата. Или, если вы хотите повторно использовать то, что у вас уже есть, вы также можете написать:
return directThrow();
Потому что directThrow()
имеет тип возврата int
, и поэтому вы просто передаете аргумент вверх.
Обратите внимание, что некоторые языки, такие как Kotlin, обрабатывают это с помощью Nothing
(иногда называемого также Never
) возвращаемого типа. Чтобы указать компилятору, что метод никогда не сможет нормально возвращаться.