Подтвердить что ты не робот

Интерфейс 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();
        }
    }
}
4b9b3361

Ответ 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 является незаконным. Это не RuntimeException и не находится в списке A, даже как подтип.