Originariamente inviato da noidhoon
Quindi se ho ben capito, se il prof mi chiede che un metodo in un determinato stato deve lanciare l'eccezione non controllata x, nella classe chiamante posso non gestire l'eccezione. Viceversa, se mi chiede che un metodo in un determinato stato deve lanciare l'eccezione y controllata, io nella classe chiamante devo o gestire l'eccezione o lanciarla di nuovo. Ho capito bene ?
Sì, il concetto è questo. Quando dici "o lanciarla di nuovo" .... sì, certo, potresti anche catturarla e rilanciarla tu. Ma se non la gestisci e ti limiti solo a dichiararla .... esce già da sola! (cioè non devi lanciarla espressamente tu).
Originariamente inviato da noidhoon
Se è così non capisco come le distinguo ? Nel senso come faccio a farla gestire o no ?
A dire il vero non ho capito io il tuo dubbio. Non è che devi tanto "distinguere" tu con del codice (anche .. si può fare). Ma il criterio è un altro: se tu invochi un metodo che "sai" che lancia una eccezione checked, allora sai già che devi scrivere il codice per o gestirla o farla passare oltre.
In una certa classe Xyz hai es:
public static void copiaFile(String sorg, String dest) throws IOException { ..... }
IOException è "checked" (estende Exception).
Da un'altra parte devi scrivere un metodo() che usa copiaFile() e hai 2 opzioni per scriverlo:
codice:
public void metodo() {
try {
Xyz.copiaFile("pippo.txt", "pluto.txt");
} catch (IOException e) {
System.err.println(e);
}
}
oppure
codice:
public void metodo() throws IOException {
Xyz.copiaFile("pippo.txt", "pluto.txt");
}
Nel primo caso l'hai gestita, nel secondo caso no e il metodo() si limita solo a dichiararla. Vuol dire che metodo() non fa nulla riguardo la eccezione e IOException può uscire fuori da metodo(). Ed essendo checked, chi invocherà metodo() dovrà poi porsi la stessa questione.
Ci sono anche soluzioni un po' "ibride", cioè catturi e rilanci la stessa eccezione o magari un'altra eventualmente con il significato più appropriato per il tuo livello di astrazione.
codice:
public void metodo() throws IOException {
try {
Xyz.copiaFile("pippo.txt", "pluto.txt");
} catch (IOException e) {
System.err.println(e);
throw e; // Rilancio!!
}
}
Qui catturo IOException, stampo la eccezione (es. per questioni di debug/log) e la rilancio pari pari. Ovviamente metodo() deve dichiararla!
codice:
public void metodo() throws MiaException {
try {
Xyz.copiaFile("pippo.txt", "pluto.txt");
} catch (IOException e) {
throw new MiaException("Copia file fallita", e);
}
}
Qui catturo IOException ma poi lancio un'altra eccezione (supponiamo checked anch'essa) che ha un messaggio specifico e "incapsula" la eccezione.