Зачем указывать для не дефолтного и не статического (т.е. обычного) метода интерфейса пробрасываемое им исключение?
Ведь при реализации данного метода в каком-то классе, имплементирующем данный интерфейс мы вовсе не обязаны обеспечить проброс данного исключения.
Вот пример:
import java.io.IOException;
public interface MyCommand {
void exit() throws IOException;
}
public class Main implements MyCommand{
@Override
public void exit() {
System.out.println("Сработал метод exit()");
}
public static void main(String[] args) {
new Main().exit();
}
}
Интерфейс он не для Вас, он для вызывающей стороны и он показывает что вызывающая сторона должна обработать исключение, а бросите вы его или нет в конкретной реализации уже дело реализации.
В вашем примере при вызове исключение не требуется к обработке т.к. вы обращаетесь не к интерфейсу, а к объекту Main и его методу exit напрямую, приведите тип и все произойдет, вот полюбуйтесь:
import java.io.IOException;
public interface MyCommand {
void exit() throws IOException;
}
public class Main implements MyCommand{
@Override
public void exit() {
System.out.println("Сработал метод exit()");
}
public static void main(String[] args) {
Main m = new Main();
// не требует обработки т.к. метод Main.exit не имеет исключения в сигнатуре
m.exit();
MyCommand c = (MyCommand) m;
// требует обработки т.к. метод MyCommand.exit имеет исключение в сигнатуре
c.exit();
}
}
Продвижение своими сайтами как стратегия роста и независимости