Lo que he sabido hasta ahora es que una subclase si se reemplaza un método de superclase debería arrojar la misma excepción o una subclase de la excepción.Cuál es el criterio para lanzar excepciones en la subclase
Por ejemplo:
esto es correcto
class SuperClass {
public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{
String signature = "(String, Integer[])";
System.out.println(str + " " + signature);
return 1;
}
}
public final class SubClass extends SuperClass {
public int doIt(String str, Integer... data) throws ArrayIndexOutOfBoundsException {
String signature = "(String, Integer[])";
System.out.println("Overridden: " + str + " " + signature);
return 0;
}
public static void main(String... args) {
SuperClass sb = new SubClass();
try {
sb.doIt("hello", 3);
} catch (Exception e) {
}
}
}
Esta es incorrecta
class SuperClass {
public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{
String signature = "(String, Integer[])";
System.out.println(str + " " + signature);
return 1;
}
}
public final class SubClass extends SuperClass {
public int doIt(String str, Integer... data) throws Exception {
String signature = "(String, Integer[])";
System.out.println("Overridden: " + str + " " + signature);
return 0;
}
public static void main(String... args) {
SuperClass sb = new SubClass();
try {
sb.doIt("hello", 3);
} catch (Exception e) {
}
}
}
Pero mi pregunta es, ¿por qué este bloque de código se considera correcta por el compilador ?
class SuperClass {
public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{
String signature = "(String, Integer[])";
System.out.println(str + " " + signature);
return 1;
}
}
public final class SubClass extends SuperClass {
public int doIt(String str, Integer... data) throws RuntimeException {
String signature = "(String, Integer[])";
System.out.println("Overridden: " + str + " " + signature);
return 0;
}
public static void main(String... args) {
SuperClass sb = new SubClass();
try {
sb.doIt("hello", 3);
} catch (Exception e) {
}
}
}
¿Quiere decir, si una excepción de tiempo de ejecución es lanzada por el método de la superclase , cualquier superclase en la jerarquía de excepciones puede ser lanzada. –
Excepción -> RuntimeException -> IndexOutOfBoundException -> ArrayIndexOutOfBoundException –
Sí, eso es correcto. La excepción declarada en la anulación debe estar en su árbol descendiente, no puede ser más grande que la excepción declarada en la superclase. –