"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:"

Giava 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Giava 7
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:"

Esempio usando finalmente
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
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
RuntimeException
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
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() ;."

Esempio
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."