La throws Exception
dichiarazione è un modo automatizzato per tenere traccia dei metodi che potrebbero generare un'eccezione per motivi previsti ma inevitabili. La dichiarazione è in genere specifica sul tipo o sui tipi di eccezioni che possono essere generate come throws IOException
o throws IOException, MyException
.
Tutti abbiamo o alla fine scriveremo codice che si arresta in modo imprevisto e segnala un'eccezione a causa di qualcosa che non avevamo previsto prima di eseguire il programma, come la divisione per zero o l'indice fuori dai limiti. Poiché gli errori non erano previsti dal metodo, non è stato possibile "intercettarli" e gestirli con una clausola try catch. Anche gli utenti ignari del metodo non sarebbero a conoscenza di questa possibilità e anche i loro programmi si fermerebbero.
Quando il programmatore sa che possono verificarsi alcuni tipi di errori ma desidera gestire queste eccezioni al di fuori del metodo, il metodo può "lanciare" uno o più tipi di eccezioni al metodo chiamante invece di gestirli. Se il programmatore non ha dichiarato che il metodo (potrebbe) lanciare un'eccezione (o se Java non ha la capacità di dichiararla), il compilatore non potrebbe saperlo e spetterebbe al futuro utente del metodo sapere, catturare e gestire eventuali eccezioni che il metodo potrebbe generare. Poiché i programmi possono avere molti livelli di metodi scritti da molti programmi diversi, diventa difficile (impossibile) tenere traccia di quali metodi potrebbero generare eccezioni.
Anche se Java ha la capacità di dichiarare eccezioni, puoi comunque scrivere un nuovo metodo con eccezioni non gestite e non dichiarate, e Java lo compilerà e potrai eseguirlo sperando per il meglio. Ciò che Java non ti consente di fare è compilare il tuo nuovo metodo se utilizza un metodo che è stato dichiarato come lanciare eccezioni, a meno che tu non gestisca le eccezioni dichiarate nel tuo metodo o dichiari che il tuo metodo lancia lo stesso eccezioni o se ci sono più eccezioni, puoi gestirne alcune e lanciare le altre.
Quando un programmatore dichiara che il metodo genera un tipo specifico di eccezione, è solo un modo automatico per avvisare gli altri programmatori che utilizzano il metodo che un'eccezione è possibile. Il programmatore può quindi decidere di gestire l'eccezione o trasmettere l'avviso dichiarando che anche il metodo chiamante genera la stessa eccezione. Poiché il compilatore è stato avvertito che l'eccezione è possibile in questo nuovo metodo, può controllare automaticamente se i futuri chiamanti del nuovo metodo gestiscono l'eccezione o la dichiarano e impongono che si verifichi l'una o l'altra.
La cosa bella di questo tipo di soluzione è che quando il compilatore segnala Error: Unhandled exception type java.io.IOException
, fornisce il file e il numero di riga del metodo che è stato dichiarato per generare l'eccezione. Puoi quindi scegliere di passare semplicemente il dollaro e dichiarare che anche il tuo metodo "genera IOException". Questa operazione può essere eseguita fino al metodo principale, dove causerebbe l'arresto del programma e segnalerebbe l'eccezione all'utente. Tuttavia, è meglio catturare l'eccezione e affrontarla in un modo carino, ad esempio spiegando all'utente cosa è successo e come risolverlo. Quando un metodo rileva e gestisce l'eccezione, non deve più dichiarare l'eccezione. Il dollaro si ferma qui, per così dire.