aus dem Abschnitt JLS Zitiert 14.20.3.1:
In einem grundlegenden Try-with-Ressourcen-Anweisung, die eine einzelne Ressource verwaltet:
Das bedeutet, dass, wenn sowohl der Code innerhalb des try
Blockes und die automatischen close()
Anweisung eine Ausnahme auslösen, der catch
Teil der Ausnahme von dem try
Block, mit Ausnahme von close()
im suppressed exceptions geworfen geworfen behandelt .
Das bedeutet auch, dass, wenn der try
Block erfolgreich ist, aber die automatischen close()
ausfällt, wird die catch
ausgeführt werden Schweller und die catched Ausnahme wird die Ausnahme von close()
geworfen werden.
Hier ist ein Test, dieses Verhalten zu überprüfen:
public class Main {
public static void main(String[] args) throws Exception {
// try block fails and close() fails
try (T t = new T()) {
throw new Exception("thrown by try part");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getSuppressed()[0].getMessage());
}
// try block is successful but close() fails
try (T t = new T()) {
//
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class T implements AutoCloseable {
@Override
public void close() throws Exception {
throw new Exception("thrown by close");
}
}
Dieser Code
thrown by try part
thrown by close
thrown by close
was bedeutet, dass die catched Ausnahme war die Ausnahme von der try Teil des Codes geworfen gedruckt wird für Der erste Teil. Für den zweiten Teil war die catched-Ausnahme in der Tat die Ausnahme, die von close()
ausgelöst wurde.
Es gibt eine catch-Anweisung propagiert, die durch die 'try' geworfen, die Ausnahmen behandelt. Ich weiß nicht, wie diese Ausnahmen in die Außenwelt geworfen werden. –
Wenn die verschließbare Ressource beim Schließen eine Ausnahme auslöst, ist die im try-Block aufgetretene Ausnahme relevanter. Daher wird sie propagiert – Chris
Bitte lesen Sie die Frage noch einmal, schauen Sie, dass OP eindeutig besagt, dass ** eine 'catch'-Anweisung verwendet wird ** –