2013-03-25 25 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 –

+2

はい、それは合法です。チェターが投稿したリンクが表示されているはずです。また、回答として投稿する必要があります。 – Thihara

+0

Thanks Thihara。そうした。 –

答えて

47

実装と拡張の一般的なルールは、あなたがあなたの新しいクラスやインタフェースが「より制限」ではなく「より制限」にすることができます。例外を制限として扱う必要があると考える場合、例外を宣言しない実装はあまり制限がありません。インタフェースをコーディングする人は、あなたのクラスに問題はありません。議論の一部として

—スタンジェームス


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

+1

明確な説明をありがとう。理にかなっている –

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のリストには含まれていません。

関連する問題