2013-03-25 765 views
31

我读到这段代码的接口抛出一个异常,但实现它不抛出一个或赶上一个类,这是为什么?在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(); 
     } 
    } 
} 
+2

您可能想查看http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface上的讨论 – 2013-03-25 03:21:54

+2

是的,这是合法的。你应该看到链接CHetter已经发布,而且他也应该可以发布它作为一个答案.. – Thihara 2013-03-25 03:23:31

+0

感谢Thihara。已经这样做了。 – 2013-03-25 03:24:53

回答

47

执行和延长的一般规则是,你可以让你的新类或接口“限制较少”,而不是“更严格”。如果您认为要将异常作为限制来处理,那么不声明异常的实现不那么严格。任何对接口进行编码的人都不会对你的课程有任何问题。

—斯坦詹姆斯


截至http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface

+1

谢谢你的明确解释。说得通 – 2015-09-19 09:25:41

11

如果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的名单,甚至作为一个亚型。