2013-03-25 188 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的名單,甚至作爲一個亞型。