ARM - Automatisches Ressourcenmanagement (eingeführt seit Java 7)
Nehmen Sie ein sehr einfaches Beispiel
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Wenn nun die readLine()
Funktion eine Ausnahme auslöst und dann sogar die close()
Funktion [im Endblock] eine Ausnahme auslöst, erhält die letztere eine höhere Priorität und wird zurück zur aufrufenden Funktion geworfen. In diesem Fall ist dieException thrown by the readLine() method is ignored/suppressed
. Sie können die verursachende Ausnahme in Ihrer Ausnahme verketten und Ihre Ausnahme aus dem endgültigen Blockieren erneut werfen.
Da java 7
Funktionen zum Abrufen unterdrückter Ausnahmen bereitgestellt wurden. Sie können die public final java.lang.Throwable[] getSuppressed()
Funktion für das abgefangene Wurfobjekt aufrufen, um die unterdrückten Ausnahmen anzuzeigen.
Zum Beispiel.
static String readFirstLineFromFileWithFinallyBlock(String path)
throws Exception {
try (BufferedReader br = new BufferedReader(new FileReader(path));) {
return br.readLine();
}
}
Wenn nun beim Schließen der Ressource eine br.readLine();
Zeile ausgelöst Exception1
und dann Exception2
beispielsweise ausgelöst wird [Stellen Sie sich vor, dies geschieht in einem impliziten Endblock, den die Anweisung "try-with-resource" erstellt], unterdrückt Exception1 Exception2.
Einige Punkte, die hier zu beachten sind -
- Wenn der Try-with-Resource-Block eine Ausnahme auslöst, dh während der Ressourceninstanziierung, wird der Try-Block nicht ausgeführt und dieselbe Ausnahme wird ausgelöst.
- Wenn die Instanziierung der Ressource erfolgreich ist, löst der Try-Block eine Ausnahme aus, und beim Schließen der Ressource wird eine Ausnahme ausgelöst. Die beim Schließen der Ressource ausgelöste Ausnahme wird durch die vom Try-Block ausgelöste Ausnahme unterdrückt.
- Wenn Sie einen expliziten finally-Block angeben und eine Ausnahme von diesem Block ausgelöst wird, werden alle anderen Ausnahmen unterdrückt. (Dieser explizite finally-Block wird ausgeführt, nachdem Ressourcen geschlossen wurden.)
Ich habe die meisten möglichen Szenarien mit Codefragmenten kompiliert und im folgenden Beitrag ausgegeben.
Unterdrückte Ausnahmen in Java 7
Hoffentlich hilft das.