Я думаю, что вы спрашиваете что-то вроде кода ниже:
public interface A
{
void foo()
throws AException;
}
public class B
implements A
{
@Overrides
public void foo()
throws AException,
BException
{
}
}
Это не будет работать, если BException не является подклассом AException. При переопределении метода вы должны соответствовать подписи, которую предоставляет родитель, а исключения являются частью подписи.
Решение состоит в том, чтобы объявить, что интерфейс также вызывает исключение BException.
Причиной этого является то, что вы не хотите код, подобный:
public class Main
{
public static void main(final String[] argv)
{
A a;
a = new B();
try
{
a.foo();
}
catch(final AException ex)
{
}
// compiler will not let you write a catch BException if the A interface
// doesn't say that it is thrown.
}
}
Что бы произошло, если бы B :: foo бросил исключение BEx? Программа должна была выйти, так как не было никакой выгоды для нее. Чтобы избежать подобных ситуаций, дочерние классы не могут изменять типы создаваемых исключений (за исключением того, что они могут удалять исключения из списка).