rairana ha scritto:
Sisi la differenza mi è molto chiara.
Bene. Allora sai che le eccezioni checked si dicono tali perché il compilatore "controlla" che siano sempre prese in considerazione in qualche modo dal programmatore, insomma non possono essere ignorate. Per le eccezioni unchecked non c'è alcun controllo o restrizione del genere.
Per quelle checked, vale la regola "handle or declare", ovvero appunto o va catturata/gestita oppure va dichiarata nel metodo affinché possa uscire più fuori.
Se ho un metodo:
public void metodoA() {
// ...
metodoB(); // questo dichiara IOException
// ...
}
NON posso lasciarlo così. metodoB() dichiara IOException che è "checked" (che poi la lanci veramente o no, è un altro discorso). Ma la dichiara e appunto non posso ignorarlo. Quindi ho 2 strade:
a) catturarla e gestirla in qualche modo:
public void metodoA() {
// ...
try {
metodoB(); // questo dichiara IOException
} catch (IOException e) {
// ... una gestione ...
}
// ...
}
oppure
b) dichiarare IOException (o supertipo) in metodoA
public void metodoA() throws IOException {
// ...
metodoB(); // questo dichiara IOException
// ...
}
In questo modo se metodoB lancia davvero IOException, questa può "uscire" da metodoA. Questo lo si fa generalmente quando in metodoA non c'è una conoscenza appropriata su come gestire l'eccezione e allora la cosa più semplice è delegare questo ad un livello superiore.
Ma chi chiama metodoA ora si dovrà porre la STESSA questione: o cattura/gestisce l'eccezione oppure a sua volta la dichiara affinché esca ancora più a monte.