Интерфейсы и исключения
Я читал об интерфейсах на 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.
На самом деле, компилятор не позволит вам сделать это