ARM - Gestión automática de recursos (introducido desde Java 7)
Tome un ejemplo muy simple
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Ahora, si la readLine()
función arroja Exception y luego incluso la close()
función [en el bloque finalmente] arroja una excepción, entonces se le da más prioridad a la última y se la devuelve a la función que llama. En este caso elException thrown by the readLine() method is ignored/suppressed
. Puede encadenar la excepción causante en su excepción y volver a lanzar su excepción desde el bloqueo final.
Dado java 7
que se ha proporcionado funcionalidad para recuperar excepciones suprimidas. Puede llamar a la public final java.lang.Throwable[] getSuppressed()
función en el objeto arrojadizo capturado para ver las Excepciones suprimidas.
Por ejemplo.
static String readFirstLineFromFileWithFinallyBlock(String path)
throws Exception {
try (BufferedReader br = new BufferedReader(new FileReader(path));) {
return br.readLine();
}
}
Ahora, si br.readLine();
se lanza una línea Exception1
y luego digamos que Exception2
se lanza mientras se cierra el recurso [Imagine que esto sucede en un bloque final implícito que crea la instrucción try-with-resource], entonces Exception1 suprime Exception2.
Algunos puntos a tener en cuenta aquí:
- Si el bloque try-with-resource arroja una excepción, es decir, mientras se crea una instancia del recurso, el bloque try no se ejecutará y se lanzará la misma excepción.
- Si la creación de instancias del recurso es exitosa, el bloque try lanza una excepción y se lanza una excepción al cerrar el recurso, luego la excepción lanzada mientras se cierra el recurso es suprimida por la excepción lanzada desde el bloque try.
- Si proporciona un bloque final explícito y se lanza una excepción desde ese bloque, se suprimirán todas las demás excepciones. (Este bloque finalmente explícito se ejecuta después de que se cierran los recursos)
He compilado la mayoría de los escenarios posibles con fragmentos de código y salida en la siguiente publicación.
Excepciones suprimidas en java 7
Espero que ayude.