Интерфейс Java генерирует исключение, но реализация интерфейса не вызывает исключения?
Я читаю этот код, где интерфейс генерирует исключение, но класс, который его реализует, не бросает его и не поймает, почему? Является ли это законным или безопасным в java?
import java.rmi.*;
public interface MyRemote extends Remote {
public String sayHello() throws RemoteException;
}
import java.rmi.*;
import java.rmi.server.*;
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
public String sayHello() {
return "Server says, 'Hey'";
}
public MyRemoteImpl() throws RemoteException {}
public static void main (String[] args) {
try {
MyRemote service = new MyRemoteImpl();
Naming.rebind("RemoteHello", service);
} catch(Exception ex)
{
ex.printStackTrace();
}
}
}
Ответы
Ответ 1
Общее правило реализации и расширения - вы можете сделать свой новый класс или интерфейс "менее ограничительным", но не "более ограничительным". Если вы считаете, что требуется исключение в качестве ограничения, реализация, которая не объявляет об исключении, менее ограничительна. Любой, кто вводит код в интерфейс, не будет иметь проблем с вашим классом.
— Стэн Джеймс
В рамках обсуждения на http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface
Ответ 2
Если Java-метод переопределяет другой в родительском классе или реализует метод, определенный в интерфейсе, он не может вызывать дополнительные проверенные исключения, но может вызывать меньше.
public class A {
public void thrower() throws SQLException {...}
}
public class B extends A {
@Override
public void thrower() throws SQLException, RuntimeException, NamingException {...}
}
SQLException
отлично; он объявлен в переопределенном методе. Его можно было бы заменить подклассом, например SerialException
.
RuntimeException
- штраф; их можно использовать где угодно.
NamingException
является незаконным. Это не RuntimeException
и не находится в списке A
, даже как подтип.