
Originariamente inviata da
blubossa
...quindi se il metodo A dichiara come eccezione una checked il metodo B di override può dichiarare un' eccezione uncheckd.
ma i ogni caso il metodo B eredita anche l'eccezione dichiarata in A?
bb
Il rilancio delle eccezioni NON VIENE ereditato.
Se il nuovo metodo dichiara MENO eccezioni (checked) di quelle del metodo originario, allora significa che quel metodo fa un lavoro diverso, ed eventuali eccezioni se le gestisce lui. Poi dipende dal tipo statico su cui viene invocato il metodo. Se il metodo lo invochi su un riferimento di tipo "ClasseBase", il compilatore non ha modo di sapere se l'oggetto realmente istanziato è di tipo "ClasseBase" o di una sua derivata più specifica... quindi, deve accontentarsi di ciò che conosce: e sa che il metodo della classe base può sollevare quelle eccezioni (poco importa se il tipo effettivo non ne solleva affatto perchè se le gestisce lui o perchè fa dell'altro... anzi, meglio, un problema in meno) e che qualunque sua derivata non può sollevarne di diverse.
Un possibile override del metodo può essere questo:
codice:
@Override
public void metodo() { // Nessuna eccezione
try {
super.metodo();
} catch (IOException ioe) {
...
}
}
Il metodo semplicemente richiama quello della superclasse e si occupa integralmente della gestione dell'eccezione. Cosa cambia a livello di uso di questo metodo? Dipende dal modo in cui si tratta l'oggetto:
codice:
// So già staticamente che si tratta di un oggetto di classe "Derivata":
// il compilatore sa che il metodo non solleva alcuna eccezione
Derivata d = new Derivata();
d.metodo();
// Non so a priori di che tipo è l'oggetto: il compilatore nemmeno.
// Il compilatore non può sapere se a run-time avrò un oggetto di tipo
// "Derivata" o di tipo "Base" o di altro tipo ancora... quindi, può solo basarsi
// sul tipo statico... che è "Base": e mi obbliga a catturare un eccezione IOException
Base b = recuperaOggetto(); // Questo metodo può tornare un oggetto di tipo "Derivata" oppure di tipo "Base" o di altro tipo, che estenda "Base"
try {
b.metodo();
} catch (IOException ioe) {
ioe.printStackTrace();
}
Forse così è più chiaro.
Ciao.