Java接口抛出异常,但接口实现不抛出异常?
问题描述:
我读到这段代码的接口抛出一个异常,但实现它不抛出一个或赶上一个类,这是为什么?在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();
}
}
}
答
执行和延长的一般规则是,你可以让你的新类或接口“限制较少”,而不是“更严格”。如果您认为要将异常作为限制来处理,那么不声明异常的实现不那么严格。任何对接口进行编码的人都不会对你的课程有任何问题。
—斯坦詹姆斯
截至http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface
+1
谢谢你的明确解释。说得通 – 2015-09-19 09:25:41
答
如果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
的名单,甚至作为一个亚型。
您可能想查看http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface上的讨论 – 2013-03-25 03:21:54
是的,这是合法的。你应该看到链接CHetter已经发布,而且他也应该可以发布它作为一个答案.. – Thihara 2013-03-25 03:23:31
感谢Thihara。已经这样做了。 – 2013-03-25 03:24:53