Lanciare un'eccezione con throw in Java

Concetti Chiave
  • L'istruzione throw in Java consente di generare esplicitamente un'eccezione.
  • Un'eccezione può essere generata utilizzando un oggetto di tipo Throwable o una sua sottoclasse.
  • Il flusso di esecuzione si interrompe immediatamente dopo l'istruzione throw, e le istruzioni successive non vengono eseguite.
  • Se un'eccezione viene generata, il blocco try più vicino viene ispezionato per trovare un gestore catch corrispondente.
  • Se non viene trovata alcuna corrispondenza catch, il gestore di eccezioni predefinito arresta il programma e stampa il tracciamento dello stack.

L'istruzione throw

Finora, abbiamo solo catturato eccezioni che vengono generate dal sistema di esecuzione Java in fase di run-time.

Tuttavia, è anche possibile per un programma generare un'eccezione esplicitamente, utilizzando l'istruzione throw. La forma generale di throw è mostrata qui:

throw IstanzaThrowable;

Qui, IstanzaThrowable deve essere un oggetto di tipo Throwable o una sottoclasse di Throwable.

I tipi primitivi, come int o char, così come le classi non-Throwable, come String e Object, non possono essere usati come eccezioni. Esistono due modi per ottenere un oggetto Throwable: usando un parametro in una clausola catch oppure creandone uno con l'operatore new.

Il flusso di esecuzione si interrompe immediatamente dopo l'istruzione throw; eventuali istruzioni successive non vengono eseguite.

Il blocco try più vicino viene ispezionato per verificare se possiede un'istruzione catch che corrisponda al tipo di eccezione. Se viene trovata una corrispondenza, il controllo viene trasferito a quella dichiarazione.

In caso contrario, viene ispezionato il successivo blocco try più esterno, e così via. Se non viene trovata alcuna corrispondenza catch, il gestore di eccezioni predefinito arresta il programma e stampa il tracciamento dello stack.

Segue un programma di esempio che crea e genera un'eccezione. Il gestore che intercetta l'eccezione la rilancia al gestore esterno.

// Dimostrazione di throw.
class DimostrazioneThrow {
    static void proceduraDemo() {
        try {
            throw new NullPointerException("demo");
        } catch(NullPointerException e) {
            System.out.println("Catturata dentro proceduraDemo.");
            throw e; // rilancio dell'eccezione
        }
    }

    public static void main(String[] args) {
        try {
            proceduraDemo();
        } catch(NullPointerException e) {
            System.out.println("Ricatturata: " + e);
        }
    }
}

Questo programma ottiene due stack di chiamate quando si verifica la stessa eccezione. Per prima cosa, main() imposta un altro contesto di gestione delle eccezioni e lancia immediatamente una nuova istanza di NullPointerException, che viene catturata sulla riga successiva. L'eccezione viene quindi rilanciata. Ecco il risultato in uscita:

Catturata dentro proceduraDemo.
Ricatturata: java.lang.NullPointerException: demo

Il programma mostra anche come creare uno degli oggetti di eccezione standard di Java. Prestare particolare attenzione a questa riga:

throw new NullPointerException("demo");

Qui, new è utilizzato per costruire un'istanza di NullPointerException.

Molte delle eccezioni di run-time incorporate in Java hanno almeno due costruttori: uno senza parametri e uno che accetta una stringa come parametro. Quando si utilizza la seconda forma, l'argomento specifica una stringa che descrive l'eccezione. Questa stringa viene visualizzata quando l'oggetto è utilizzato come argomento di print() o println(). Può anche essere ottenuta tramite una chiamata al metodo getMessage(), definito da Throwable.