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 7Funktionen 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 Exception1und dann Exception2beispielsweise 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.