En el último post discutimos acerca de la anulación del método. En este post veremos cómo hacer el manejo de excepciones para los métodos de anulación y anulación.
Regla: Un método overriding (el método de la clase hijo) puede lanzar cualquier excepción no marcada, independientemente de si el método overridden (método de la clase base) lanza excepciones o no. Sin embargo, el método de prevalencia no debe arrojar excepciones comprobadas que sean nuevas o más amplias que las declaradas por el método de prevalencia. El método predominante puede descartar las excepciones verificadas que tengan menos alcance que las excepciones declaradas en el método predominante.
Comprendamos la explicación anterior con la ayuda de algunos ejemplos:
Ejemplo 1: Si la clase base no lanza ninguna excepción pero la clase infantil lanza una excepción no marcada.
En este ejemplo la clase Room está anulando el método color(). El método overridden no lanza ninguna excepción, pero el método overriding lanza una excepción no marcada (NullPointerException). Una vez compilado el código se ejecutó con éxito.
class Building { void color() { System.out.println("Blue"); } }clase Room extiende Building{ //Lanza una excepción no marcada void color() lanza NullPointerException { System.out.println("White"); } public static void main(String args[]){ Building obj = new Room(); obj.color(); } }
Salida:
Blanco
Ejemplo 2: Si la clase base no lanza ninguna excepción pero la clase infantil lanza una excepción marcada
importar java.io.*;class Building { void color() { System.out.println("Blue"); } }clase Sala se extiende Edificio{ color del vacío() lanza IOException { System.out.println("Blanco"); } vacío estático público main(String args[]){ Edificio obj = nueva Sala(); try{ color del objeto(); }catch(Excepción e){ System.out.println(e); } } }
Salida:
Excepción en el hilo "principal" java.lang.Error: Problema de compilación no resuelto: La excepción IOException no es compatible con la cláusula de lanzamiento en Building.color()
El código anterior tiene un error de compilación: Porque el método anulado (método de clase hijo) no puede lanzar una excepción comprobada si el método anulado (método de clase base) no lanza una excepción.
Ejemplo 3: Cuando tanto la clase base como la clase hija lanzan una excepción comprobada
importar java.io.*;class Building { void color() throws IOException { System.out.println("Blue"); } }clase Sala se extiende Edificio{ color del vacío() lanza IOException { System.out.println("Blanco"); } vacío estático público main(String args[]){ Edificio obj = nueva Sala(); try{ color del objeto(); }catch(Excepción e){ System.out.println(e); } } }
Salida:
Blanco
El código funcionó bien porque el método color() de la clase hija NO arroja una excepción comprobada con un alcance más amplio que la excepción declarada por el método color() de la clase base.
Ejemplo 4: Cuando el método de la clase hija está lanzando una excepción comprobada con alcance más amplio que el mismo método de la clase base
paquete beginnersbook.com;import java.io.*;class Building { void color() throws IOException { System.out.println("Blue"); } }clase Sala se extiende Edificio{ color del vacío() lanza Excepción { System.out.println("Blanco"); } vacío estático público main(String args[]){ Edificio obj = nueva Sala(); try{ obj.color(); }catch(Excepción e){ System.out.println(e); } } }
Salida:
Error de compilación debido a que el método color() de la clase hija está lanzando una excepción que tiene un alcance más amplio que la excepción lanzada por el método color() de la clase padre.