Tomemos una pregunta de entrevista. Hay un método que arroja NullPointerException en la superclase. ¿Podemos anularlo con un método que arroje RuntimeException?
Para responder a esta pregunta, háganos saber qué es una excepción sin marcar y marcada.
Las excepciones marcadas deben capturarse o propagarse explícitamente como se describe en Manejo básico de excepciones try-catch-billion. Las excepciones no marcadas no tienen este requisito. No tienen que ser capturados ni declarados arrojados.
Las excepciones marcadas en Java amplían la clase java.lang.Exception. Las excepciones no comprobadas extienden la excepción java.lang.RuntimeException.
La clase pública NullPointerException extiende RuntimeException
Las excepciones no comprobadas extienden la excepción java.lang.RuntimeException. Por eso, NullPointerException es una excepción no comprobada.
Tomemos un ejemplo: Ejemplo 1:
public class Parent {
public void name() throws NullPointerException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws RuntimeException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
El programa se compilará correctamente. Ejemplo 2:
public class Parent {
public void name() throws RuntimeException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws NullPointerException {
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
El programa también se compilará con éxito. Por lo tanto, es evidente que no ocurre nada en caso de excepciones no comprobadas. Ahora, echemos un vistazo a lo que sucede en el caso de las excepciones marcadas. Ejemplo 3: cuando la clase base y la clase secundaria arrojan una excepción marcada
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws IOException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();// output=> child
}catch( Exception e) {
System.out.println(e);
}
}
}
El programa se compilará correctamente. Ejemplo 4: cuando el método de la clase secundaria arroja una excepción de borde comprobado en comparación con el mismo método de la clase base.
import java.io.IOException;
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws Exception{ // broader exception
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();//output=> Compilation failure
}catch( Exception e) {
System.out.println(e);
}
}
}
El programa no se podrá compilar. Por lo tanto, debemos tener cuidado cuando utilizamos excepciones marcadas.