Try-Catch-Finalmente in Java | La gestione delle eccezioni
· Blocchi Try
· Blocchi Catch
· Blocchi Finalmente
· Mettere tutto insieme
· Blocchi try nidificati
· Cattura eccezioni multiple
Prova i blocchi
I blocchi try sono la prima parte dei blocchi try/catch. Contengono qualsiasi codice che potrebbe causare un'eccezione. In Java, quando non siamo certi del risultato di un'istruzione, possiamo inserire tali istruzioni all'interno di questo blocco try. Un blocco try può essere utilizzato in un metodo o in un altro blocco try.
Il blocco try è sempre seguito da un blocco catch , che gestisce l'eccezione che si verifica nel blocco try associato.
Per IOExceptions, inserisci qualsiasi codice che sta creando, leggendo, scrivendo o chiudendo un file all'interno di un blocco try
Sintassi
Il primo passaggio nella costruzione di un gestore di eccezioni consiste nel racchiudere il codice che potrebbe generare un'eccezione all'interno di un blocco try . In generale, un blocco try è simile al seguente:
try {
code
}
catch and finally blocks . . .
Esempio
Per costruire un gestore di eccezioni per il metodo writeList dalla classe ListOfNumbers, racchiudere le istruzioni che generano eccezioni del metodo writeList all'interno di un blocco try . C'è più di un modo per farlo. È possibile inserire ogni riga di codice che potrebbe generare un'eccezione all'interno del proprio blocco try e fornire gestori di eccezioni separati per ciascuno. In alternativa, puoi inserire tutto il codice writeList all'interno di un singolo blocco try e associarvi più gestori. Il listato seguente utilizza un blocco try per l'intero metodo perché il codice in questione è molto breve.
private List<Integer> list;
private static final int SIZE = 10;
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entered try statement");
FileWriter f = new FileWriter("OutFile.txt");
out = new PrintWriter(f);
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
}
catch and finally blocks . . .
}
Prova Block Side Notes
- Oltre al codice che potrebbe attivare un'eccezione, i blocchi try possono (ma non devono) contenere anche codice che non causa eccezioni.
- I programmi possono contenere più di un blocco try. Inoltre, è possibile avere un blocco try all'interno di un altro blocco try.
Blocchi di cattura
La seconda metà di un blocco try/catch è il blocco catch. Mentre i blocchi try contengono il codice che causa un'eccezione, i blocchi catch contengono il codice che gestisce un'eccezione.
In Java, il blocco catch viene utilizzato per gestire l'eccezione che viene rilevata dal blocco try. Il blocco catch include il codice e viene eseguito se si verifica un'eccezione all'interno del blocco try. Se il sistema incontra un'eccezione durante l'esecuzione delle istruzioni in un blocco try, ignora il resto delle istruzioni e trasferisce il controllo al blocco catch corrispondente.
Il blocco catch rileva e gestisce le eccezioni del blocco try dichiarando il tipo di eccezione all'interno del parametro. L'eccezione dichiarata nel blocco catch deve essere l'eccezione della classe genitore (ovvero, Exception) o il tipo di eccezione generato. Tuttavia, l'approccio migliore consiste nel dichiarare il tipo di eccezione generato.
Il blocco catch seguirà sempre dopo il blocco try. Una volta che il controllo esce dal blocco try, non c'è modo di riportarlo indietro per provare il blocco.
Sintassi
Puoi associare i gestori di eccezioni a un blocco try fornendo uno o più blocchi catch direttamente dopo il blocco try . Nessun codice può trovarsi tra la fine del blocco try e l'inizio del primo blocco catch .
try {
} catch (ExceptionType name) {
}
Il blocco catch contiene il codice che viene eseguito se e quando viene richiamato il gestore delle eccezioni. Il sistema di runtime richiama il gestore di eccezioni quando il gestore è il primo nello stack di chiamate il cui ExceptionType corrisponde al tipo di eccezione generata. Il sistema lo considera una corrispondenza se l'oggetto lanciato può essere legalmente assegnato all'argomento del gestore di eccezioni.
Catch Block Argomenti
I blocchi catch accettano un argomento, il tipo di eccezione che dovrebbero catturare (gestire). Questi argomenti possono variare da un tipo molto specifico di eccezione a una categoria di eccezioni catch-all molto generale
Esempio
Di seguito sono riportati due gestori di eccezioni per il metodo writeList :
try {
} catch (IndexOutOfBoundsException e) {
System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
Cattura il contenuto del blocco
I contenuti di un blocco catch sono ciò che vuoi che accada quando si verifica un'eccezione (ad esempio quando il file a cui si accede non esiste). Puoi stampare un messaggio o avere un codice che faccia qualcosa per correggere l'errore (ad esempio chiedere il nuovamente il nome del file.
Catch Block Messages (visualizzazione di una descrizione di un'eccezione)
Puoi stampare qualsiasi messaggio che ti piace all'interno di un blocco catch.
Utilizzo di toString()
Throwable sovrascrive il metodo toString() (definito da Object) in modo che restituisca una stringa contenente una descrizione dell'eccezione. È possibile visualizzare questa descrizione in un'istruzione println() semplicemente passando l'eccezione come argomento. Ad esempio, il blocco catch nel programma precedente può essere riscritto in questo modo
catch (ArithmeticException e) {
System.out.println("Exception: " + e);
a = 0; // set a to zero and continue
}
Exception: java.lang.ArithmeticException: / by zero
- getMessage() : restituisce un messaggio di errore specifico per ogni tipo di eccezione. Abbinalo a un'istruzione println.
- printStackTrace() : stampa il tipo di errore e dove si è verificato nel programma Questi metodi sono particolarmente utili per il debug e per trovare il motivo di un'eccezione
- Ogni blocco try necessita di almeno un blocco catch.
- I blocchi try possono avere più blocchi catch. Vedere l'esempio a destra.
- I blocchi catch devono venire subito dopo il blocco try a cui sono abbinati.
Infine Blocchi
Una parola chiave finally viene utilizzata per creare un blocco di codice che segue un blocco try. Un blocco di codice finally viene sempre eseguito indipendentemente dal fatto che si sia verificata o meno un'eccezione. Utilizzando un blocco finally, ti consente di eseguire qualsiasi istruzione di tipo cleanup che desideri eseguire, indipendentemente da ciò che accade nel codice protetto. Un blocco finally appare alla fine del blocco catch. infine i blocchi vengono utilizzati per annullare i riferimenti agli oggetti e chiudere i flussi di I/O.
Il blocco finally viene sempre eseguito quando il blocco try termina. Ciò garantisce che il blocco finally venga eseguito anche se si verifica un'eccezione imprevista. Ma infine è utile per qualcosa di più della semplice gestione delle eccezioni: consente al programmatore di evitare che il codice di pulizia venga accidentalmente aggirato da return , continue o break . Mettere il codice di pulizia in un blocco finally è sempre una buona pratica, anche quando non sono previste eccezioni.
Il sistema di runtime esegue sempre le istruzioni all'interno del blocco finally indipendentemente da ciò che accade all'interno del blocco try . Quindi è il posto perfetto per eseguire la pulizia.
Sintassi
finally {
// cleanup code
}
Il seguente blocco finally per il metodo writeList pulisce e quindi chiude PrintWriter e FileWriter .
finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
if (f != null) {
System.out.println("Closing FileWriter");
f.close();
}
}
- Infine i blocchi sono un'aggiunta facoltativa ai blocchi try/catch.
- Infine i blocchi vengono utilizzati per il codice che si desidera eseguire, indipendentemente da ciò che accade in modo eccezionale con il codice.
- Sono l'ultima cosa che viene eseguita e verranno eseguite ogni volta che esegui il tuo programma.
- Un uso di un blocco finally sarebbe quello di assicurarsi che un file sia chiuso alla fine di un programma.
private List<Integer> list;
private static final int SIZE = 10;
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entered try statement");
FileWriter f = new FileWriter("OutFile.txt");
out = new PrintWriter(f);
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
}
// catch blocks
catch (IndexOutOfBoundsException e) {
System.err.println("IndexOutOfBoundsException: " + e.getMessage());
}
catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
// finally block
finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
if (f != null) {
System.out.println("Closing FileWriter");
f.close();
}
}
}
Quando vengono utilizzati i blocchi try nidificati , il blocco try interno viene eseguito per primo. Qualsiasi eccezione generata nel blocco try interno viene rilevata nel blocco catch corrispondente. Se non viene trovato un blocco catch corrispondente, viene ispezionato il blocco catch del blocco try esterno . Questo processo continua fino all'esaurimento di tutte le istruzioni try nidificate. Se non viene trovato alcun blocco catch corrispondente, il programma termina in modo anomalo.
visita il blocco try-catch nidificato .
Cattura più eccezioni
Come forse saprai in java possiamo utilizzare più blocchi catch per gestire più eccezioni
Esempio :
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
Esempio :
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
Buon apprendimento
Unisciti al gruppo Mouad Oumous Java WhatsApp ISCRIVITI
Unisciti al canale Telegram di Mouad Oumous ISCRIVITI
Sostieni la nostra pubblicazione seguendola
Guida introduttiva a Spring Boot: un tutorial completo per principianti Spring Boot Security | SO | OAuth2 con Okta Domanda di intervista basata sul flusso Java8 più comunemente richiesta - Parte 2 Guida alla mappatura degli oggetti con ModelMapper nella codifica Java: appiattisci un array in Javascript Domanda di intervista basata sul flusso Java8 più comunemente richiesta - Parte 1
![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































