Java 接口抛出异常,但接口实现不抛出异常?

2022-08-31 15:37:09

我读了这段代码,其中接口抛出了一个异常,但是实现它的类没有抛出一个或捕获一个,这是为什么呢?它在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();
        }
    }
}

答案 1

实现和扩展的一般规则是,您可以使新类或接口“限制较少”,但不能使“限制性更强”。如果将处理异常的要求视为限制,则不声明异常的实现限制较少。任何编码到界面的人都不会遇到你的类的麻烦。

— 斯坦·詹姆斯


作为 http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface 讨论的一部分


答案 2

如果 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是非法的。它不是 ,也不在 列表中,即使作为子类型也是如此。RuntimeExceptionA