Specificare quali eccezioni un metodo può lanciare con throws in Java
- L'istruzione
throws
in Java consente di dichiarare le eccezioni che un metodo può generare, permettendo ai chiamanti di gestirle adeguatamente. - Un metodo che può generare un'eccezione deve specificare questo comportamento nella sua dichiarazione, utilizzando una clausola
throws
. - La clausola
throws
elenca i tipi di eccezioni che un metodo può generare, ad eccezione diError
eRuntimeException
o le loro sottoclassi. - Se un metodo genera un'eccezione che non gestisce, deve dichiararlo nella sua clausola
throws
, altrimenti si verificherà un errore di compilazione.
L'istruzione throws
Se un metodo è in grado di generare un'eccezione che non gestisce, deve specificare questo comportamento affinché i chiamanti del metodo possano proteggersi da tale eccezione.
Questo si fa includendo una clausola throws
nella dichiarazione del metodo. Una clausola throws
elenca i tipi di eccezioni che un metodo potrebbe generare. Questo è necessario per tutte le eccezioni, tranne quelle di tipo Error
o RuntimeException
, o una loro sottoclasse.
Tutte le altre eccezioni che un metodo può generare devono essere dichiarate nella clausola throws
. Se non lo sono, si verificherà un errore in fase di compilazione.
Questa è la forma generale di una dichiarazione di metodo che include una clausola throws
:
type nomeMetodo(listaParametri) throws listaEccezioni
{
// corpo del metodo
}
Qui, listaEccezioni
è un elenco separato da virgole delle eccezioni che un metodo può generare.
Segue un esempio di programma non corretto che cerca di generare un'eccezione che non cattura. Poiché il programma non specifica una clausola throws
per dichiarare questo fatto, il programma non verrà compilato.
// Questo programma contiene un errore e non verrà compilato.
class DimostraThrows {
static void generaUno() {
System.out.println("Dentro generaUno.");
throw new IllegalAccessException("esempio");
}
public static void main(String[] args) {
generaUno();
}
}
Correzioni necessarie per la compilazione
Per fare in modo che questo esempio venga compilato, bisogna apportare due modifiche:
- è necessario dichiarare che
generaUno()
generaIllegalAccessException
. main()
deve definire un bloccotry / catch
che intercetti questa eccezione.
L'esempio corretto è mostrato qui:
// Questo ora è corretto.
class DimostraThrows {
static void generaUno() throws IllegalAccessException {
System.out.println("Dentro generaUno.");
throw new IllegalAccessException("esempio");
}
public static void main(String[] args) {
try {
generaUno();
} catch (IllegalAccessException e) {
System.out.println("Catturato " + e);
}
}
}
Ecco l'output generato dall'esecuzione di questo programma di esempio:
Dentro generaUno
Catturato java.lang.IllegalAccessException: esempio