Интерфейсы и исключения

Я читал об интерфейсах на tutorialspoint и наткнулся на следующее:

"Проверенные исключения не должны объявляться в методах реализации, отличных от тех, которые объявлены методом интерфейса, или подклассов тех, которые объявлены методом интерфейса".

Может ли кто-нибудь объяснить мне, что именно это означает?

2 ответа

Решение

Проверенные исключения - это исключения, которые должны быть объявлены в сигнатуре типа метода, который может их выбросить. Эта цитата говорит о том, что класс, реализующий интерфейс, не должен добавлять никаких проверенных исключений в сигнатуру методов, которые он реализует из интерфейса.

Так что если у вас есть такой интерфейс:

interface NoExceptions{
    void safeMethod();
}

Вам запрещено объявлять такой класс:

class UnsafeClass{
    @Override
    void safeMethod() throws IOException{}
}

Так как он изменяет сигнатуру типа. Вместо этого эти исключения должны обрабатываться внутри метода.

Это связано с тем, что цель проверенных исключений состоит в том, чтобы гарантировать, что вызывающий код обработает возможную проблему, которая может возникнуть. Попытка добавить исключение в подкласс устраняет эту безопасность:

UnsafeClass uc = new UnsafeClass();
uc.safeMethod(); //Not allowed, because the exception is not handled
NoExceptions ne = uc;
ne.safeMethod(); //Becomes allowed, because the interface does not declare an exception

Из-за этого вам запрещено добавлять подобные исключения.

Однако вы могли бы написать реализацию, которая генерирует подкласс проверенного исключения, объявленного в интерфейсе. Это всегда будет безопасной операцией, потому что подкласс может использоваться в качестве замены для его суперкласса.

Это означает, что если метод интерфейса, который я объявил как выбрасывающий некоторое проверенное исключение E, чем некоторый клиентский код, использующий интерфейс, должен явно обработать это проверенное исключение (путем try-catch или броска далее). И если вы попытаетесь объявить еще несколько проверенных исключений (E1) в вашем классе C, реализующем I, это нарушит логику приложения: клиенты I не имеют представления об исключениях, генерируемых кроме E.

На самом деле, компилятор не позволит вам сделать это

Другие вопросы по тегам