Specificare quali eccezioni un metodo può lanciare con throws in Java

Concetti Chiave
  • 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 di Error e RuntimeException 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();
    }
}
Nota

Correzioni necessarie per la compilazione

Per fare in modo che questo esempio venga compilato, bisogna apportare due modifiche:

  1. è necessario dichiarare che generaUno() genera IllegalAccessException.
  2. main() deve definire un blocco try / 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