"Ah. Eccoti. Ti stavo cercando."
"È successo qualcosa?"
"No, ma stiamo ancora studiando."
"OK. Sto ascoltando."
"Voglio dirti ancora un paio di cose sulle eccezioni:"
"In Java 7, il costrutto try-catch è stato leggermente esteso attraverso l'aggiunta di più blocchi catch. Guarda questo esempio:"
try
{
…
}
catch (IOException ex)
{
logger.log(ex);
throw ex;
}
catch (SQLException ex)
{
logger.log(ex);
throw ex;
}
try
{
…
}
catch (IOException | SQLException ex)
{
logger.log(ex);
throw ex;
}
"Quindi ora possiamo scrivere più eccezioni separate da operatori OR ('|' è OR binario)?"
"Esatto. Non è conveniente?"
"Hmm. Ma quale sarà il tipo dell'oggetto eccezione all'interno del blocco catch?"
"Dopotutto, una IOException ha i suoi metodi e una SQLException ha i suoi metodi."
"Il tipo di eccezione sarà quello della loro classe antenata comune."
"Ah. In altre parole, molto probabilmente sarà Exeption o RuntimeException . Allora perché non scrivere semplicemente catch(Exception e)?"
"A volte quando si gestiscono gli errori individualmente, è conveniente raggrupparli, scrivere alcuni errori in un registro, rilanciarne altri e gestirne altri in qualche altro modo."
"In altre parole, questo schema è riconosciuto per risolvere il problema dei blocchi catch duplicati per la gestione di errori diversi."
"Ah. Ho capito. Grazie, Ellie."
"Non è tutto. Voglio dirti qualcosa in più sul blocco finally ."
"Come probabilmente già saprai, questo blocco viene sempre eseguito."
"E quando dico sempre, intendo assolutamente sempre ."
"Per esempio:"
try
{
return 1;
}
finally
{
return 0;
}
"Qui c'è un ritorno nel blocco try e un ritorno nel blocco finally . Quindi il valore restituito da questo metodo sarà il numero 0."
"Il blocco finally verrà eseguito qualunque cosa accada. E la sua istruzione return sovrascrive l'altro valore restituito con il proprio valore."
"Vedo."
"Tuttavia, un metodo può restituire un valore o generare un'eccezione. "
"Quindi, se un valore viene restituito in un blocco try, ma il blocco finally genera un'eccezione , il risultato sarà un'eccezione . "
"Cosa succede se viene generata un'eccezione nel blocco try ma il blocco finally ha un'istruzione return?"
"Quindi è come se il metodo funzionasse correttamente e venisse restituito il valore nell'istruzione return.
Esempio | Risultato |
---|---|
|
0 |
|
RuntimeException |
|
0 |
|
IOException |
"L'unico motivo per cui il metodo finally potrebbe non essere eseguito sarebbe la terminazione immediata del programma mediante una chiamata al metodo System.exit() ;."
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
"Vedo."
"Tieni presente che tutti questi argomenti vengono solitamente richiesti nelle interviste, quindi sarebbe bene che tu li capissi e li ricordassi."
GO TO FULL VERSION