Представьте, что есть абонент, который звонит Test#run
. В объявлении Test#run
говорится, что он может выдать IOException
, поэтому вызывающая сторона знает, что может перехватить и обработать его:
Test test = // it could be instance of SubTest of Sub2Test
try {
test.run();
} catch (IOException e) {
}
Тогда все в порядке, если SubTest
не выбрасывает IOException
вызывающий не пропустит ничего.
Но если вы бросите какой-нибудь проверенный Exception
, такой как Sub2Test
, так как вызывающий не узнает об этом до времени выполнения, вызываемый не сможет его перехватить и обработать. Так что это не должно быть скомпилировано.