Помимо хороших ответов других о компилируемости ваших методов, существует вопрос реализации интерфейсов и переопределения методов в суперклассах.
Правило гласит, что вы можете переопределить / реализовать метод, но вы не можете объявить дополнительное исключение к тем, которые объявлены исходной сигнатурой метода. Чтобы понять это, подумайте об этом примере.
Допустим, вы используете какую-то структуру данных:
public abstract class AbstractBox {
public abstract void addItem(Item newItem);
public abstract void removeItem(Item oldItem);
}
У вас есть собственная реализация, но вы решили объявить исключения, которые не отображаются в исходной подписи:
public class MyBox extends AbstractBox {
public void addItem(Item newItem) throws ItemAlreadyPresentException {...}
public void removeItem(Item oldItem) throws NoSuchItemException {...}
}
Теперь давайте рассмотрим этот универсальный код, который обрабатывает объекты Box и получает экземпляр MyBox:
public void boxHandler(AbstractBox box) {
Item item = new Item();
box.removeItem(item);
}
Кто бы ни написал этот код, он не ожидал никаких исключений и не собирался обрабатывать исключения разработчиков. Чтобы предотвратить это, компилятор не позволит вам объявлять дополнительные исключения к тем, которые содержатся в исходной подписи.
Конечно, если вы обрабатываете исключения внутренне ... хорошо, компилятор будет более чем счастлив позволить вам удалить объявленные исключения из вашей подписи; -)
Надеюсь, это поможет ...
Ювал = 8 -)