"Ah. Ahí estás. Te he estado buscando".

"¿Paso algo?"

"No, pero todavía estamos estudiando".

"Está bien. Estoy escuchando".

"Quiero contarles un par de cosas más sobre las excepciones:"

"En Java 7, la construcción try-catch se amplió ligeramente mediante la adición de varios bloques catch. Mire este ejemplo:"

Java 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Java 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

"Entonces, ¿podemos escribir varias excepciones separadas por operadores OR ('|' es OR binario)?"

"Así es. ¿No es eso conveniente?"

"Hmm. Pero, ¿cuál será el tipo del objeto de excepción dentro del bloque catch?"

"Después de todo, una IOException tiene sus métodos y una SQLException tiene sus métodos".

"El tipo de excepción será el de su clase de ancestro común".

"Ah. En otras palabras, lo más probable es que sea Exeption o RuntimeException . Entonces, ¿por qué no simplemente escribir catch(Exception e)?"

"A veces, cuando se manejan los errores individualmente, es conveniente agruparlos, escribir algunos errores en un registro, volver a generar otros y manejar otros de alguna otra manera".

"En otras palabras, se reconoce que este esquema resuelve el problema de los bloques catch duplicados para manejar diferentes errores".

"Ah. Lo entiendo. Gracias, Ellie".

"Eso no es todo. Quiero contarles un poco más sobre el bloque finalmente ".

"Como probablemente ya sepa, este bloque siempre se ejecuta".

"Y cuando digo siempre, quiero decir absolutamente siempre ".

"Por ejemplo:"

Ejemplo usando finalmente
try
{
 return 1;
}
 finally
{
 return 0;
}

"Aquí hay un retorno en el bloque de prueba y un retorno en el bloque finalmente . Por lo tanto, el valor de retorno de este método será el número 0".

"El bloque finalmente se ejecutará pase lo que pase. Y su declaración de retorno sobrescribe el otro valor de retorno con su propio valor".

"Veo."

"Sin embargo, un método puede devolver un valor o lanzar una excepción " .

"Entonces, si se devuelve un valor en un bloque de prueba, pero el bloque finalmente arroja una excepción , entonces el resultado será una excepción " .

"¿Qué sucede si se lanza una excepción en el bloque de prueba pero el bloque finalmente tiene una declaración de devolución?"

"Entonces es como si el método funcionara correctamente y se devolviera el valor en la declaración de devolución.

Ejemplo Resultado
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
Excepción en tiempo de ejecución
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IOException

"La única razón por la que el método finalmente podría no ejecutarse sería la finalización inmediata del programa mediante una llamada al método System.exit(); ".

Ejemplo
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Veo."

"Tenga en cuenta que todos estos temas generalmente se preguntan en las entrevistas, por lo que sería bueno que los comprendiera y recordara".