polimorfismo las interfaz interfaces implementacion herencia ejemplos clase caracteristicas abstracta java exception interface

las - interfaces en java pdf



La interfaz Java arroja una excepción, pero la implementación de la interfaz no arroja una excepción. (3)

Una regla general de implementación y extensión es que puede hacer que su nueva clase o interfaz sea "menos restrictiva" pero no "más restrictiva". Si considera el requisito de manejar una excepción como una restricción, una implementación que no declara la excepción es menos restrictiva. Cualquiera que codifique en la interfaz no tendrá problemas con tu clase.

- Stan James

Como parte de la discusión en coderanch.com/t/399874/java/java/…

Leí este código donde la interfaz arroja una excepción, pero la clase que lo implementa no arroja uno ni atrapa uno, ¿por qué? ¿Es legal o seguro en 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(); } } }


Gran respuesta de @Chetter Hummin.

Una forma de ver esto, y me resulta fácil de recordar, es que las implementaciones de la interfaz pueden ser más específicas pero no más generales.

Por ejemplo, en interfaz void test() throws Exception significa "prueba puede arrojar excepción"

entonces la implementación puede ser void test() significa "prueba no arrojará excepción" (más específica)

o implementación puede ser void test() throws NullpointerException (más específica)

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 } }


Si un método Java anula a otro en una clase principal, o implementa un método definido en una interfaz, puede que no arroje excepciones comprobadas adicionales, pero puede arrojar menos.

public class A { public void thrower() throws SQLException {...} } public class B extends A { @Override public void thrower() throws SQLException, RuntimeException, NamingException {...} }

SQLException está bien; está declarado en el método reemplazado. Incluso podría ser reemplazado por una subclase como SerialException .

RuntimeException está bien; esos se pueden usar en cualquier lugar.

NamingException es ilegal. No es una RuntimeException , y no está en la lista de A, incluso como un subtipo.