Quello che ho saputo fino ad ora è che una sottoclasse se si sostituisce un metodo di superclasse dovrebbe generare la stessa eccezione o una sottoclasse dell'eccezione.Quali sono i criteri per il lancio di eccezioni nella sottoclasse
Ad esempio:
questo è corretto
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) {
}
}
}
questo non è corretto
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) {
}
}
}
Ma la mia domanda è, perché questo blocco di codice viene considerata corretta dal compilatore ?
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) {
}
}
}
significa, se un'eccezione di runtime viene lanciata dal metodo della superclasse , qualsiasi superclasse nella gerarchia di eccezioni può essere lanciata. –
Eccezione -> RuntimeException -> IndexOutOfBoundException -> ArrayIndexOutOfBoundException –
Sì, è corretto. L'eccezione dichiarata nell'override deve essere nell'albero discendente, non può essere maggiore dell'eccezione dichiarata nella super classe. –