61

インターフェイスが例外をスローするこのコードを読みましたが、それを実装するクラスは例外をスローしたりキャッチしたりしません。なぜですか?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();
        }
    }
}
4

3 に答える 3

85

実装と拡張の一般的なルールは、新しいクラスまたはインターフェースを「制限を緩和」することはできますが、「制限を強化」することはできません。例外を処理する要件を制限と考える場合、例外を宣言しない実装の制限は少なくなります。インターフェイスにコーディングする人は誰でも、クラスで問題が発生することはありません。

—スタンジェームス


http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interfaceでのディスカッションの一部として

于 2013-03-25T03:24:32.567 に答える
24

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

于 2013-03-25T03:29:34.927 に答える
9

@ChetterHumminによる素晴らしい答え。

これを見る1つの方法は、覚えやすいと思いますが、インターフェイスの実装はより具体的である可能性がありますが、より一般的ではない可能性があります。

たとえば、インターフェースvoid test() throws Exceptionでは「テスト例外をスローする可能性があります」を意味します

その場合、実装void test()は「テストは例外をスローしない」という意味になります(より具体的に)

または実装はvoid test() throws NullpointerException(より具体的に)することができます

interface x {
    void testException() throws Exception;
}

public class ExceptionTest implements x {
    @Override
    public void testException() {   //this is fine
    }

    ////// or

    @Override
    public void testException() throws NullPointerException {  // this is fine
    }
}
于 2018-06-21T11:15:34.950 に答える