В вашем классе SaveButtonAction
вы реализуете метод actionPerformed
, как это определено в интерфейсе ActionListener
.
Если вы проверите исходный код, вы увидите, что ActionListener#actionPerformed
не генерирует никаких исключений в своей подписи. Тем не менее, когда вы реализуете его, вы выполняете вызов Oval#save
, который выбрасывает IOException
. Пытаясь это сделать, вы добавляете предложение throws
в сигнатуру метода, тем самым изменяя его.
Это фактически нарушает контракт, определенный интерфейсом, и приводит к ошибке, упомянутой в вашем вопросе.
Либо потеряйте предложение throws
и обработайте исключение внутренне, либо, если вы так заинтересованы в нем, оберните его в непроверенное исключение и повторно сгенерируйте его.
Я бы также настоятельно рекомендовал ознакомиться с правильным способом реализации интерфейсов. Кажется, вам не хватает этой области.