Ich dachte, Try-with-Resources könnte nur für Dinge verwendet werden, die im Allgemeinen IOExceptions generieren würden. Es scheint, dass es mit AutoCloseable für verschiedene Klassen aktiviert werden kann.
Die try-with-resources-Anweisung ist eine try-Anweisung, die eine oder mehrere Ressourcen deklariert. Ressourcen sind Objekte, die nach Abschluss des Programms geschlossen werden müssen. Die Anweisung "try-with-resources" stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen wird. Sie können jedes Objekt verwenden, das java.lang.AutoCloseable als Ressource implementiert, einschließlich aller Objekte, die java.io.Closeable implementieren.
Oracle Java Documentation https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Mit anderen Worten, wenn Sie AutoCloseable implementieren, können Sie Try-with-Resources unterstützen!
Ein Objekt, das eine Ressource (z. B. eine Datei oder ein Socket-Handle) enthalten kann, bis sie geschlossen wird. Die close () -Methode eines AutoCloseable-Objekts wird automatisch aufgerufen, wenn der Try-with-Resources-Block verlassen wird, in dem das Objekt im Ressourcenspezifikationsheader deklariert ist. Diese Struktur garantiert eine schnelle Freigabe und vermeidet Ausnahmen bei Ressourcenknappheit und andere mögliche Fehler. Im Paket java.lang enthalten.
Interface AutoCloseable https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/AutoCloseable.html
Ich möchte, dass Try-with-Resources automatisch geschlossen wird, wenn die try-Anweisung endet. Implementieren Sie außerdem die AutoCloseable-Schnittstelle für die Zielressource, für die beim Schließen ein spezieller Prozess eingefügt werden soll.
Ähnlich wie bei AutoCloseable gibt es Closeable. Dies ist eine Schnittstelle, die AutoCloseable erbt und im Paket java.io enthalten ist. AutoCloseable löst eine Ausnahme aus, wenn eine Ausnahme auftritt, während Closeable eine IOException auslöst.
Die meisten Klassen im Paket java.io implementieren Closeable Klassen wie FileOutputStream und BufferedReader können mit try-with-resources deklariert werden.
Wenn Sie Ressourcen automatisch mit Try-with-Resources freigeben möchten Es wird verwendet, wenn Sie beim Freigeben von Ressourcen eine andere Verarbeitung hinzufügen möchten.
SampleTryWithResources.java
public class SampleTryWithResources {
public static void main(String[] args) {
// Closeable(AutoCloseable)Die Klasse, die implementiert
// try-with-Wenn es mit Ressourcen deklariert ist, wird es am Ende der try-Anweisung automatisch geschlossen.()Wird ausgeführt.
try (SampleCloseAble sca = new SampleCloseAble()) {
System.out.println("Try-With-Ressourcen beginnen");
System.out.println("Versuchen Sie die laufende Anweisung");
System.out.println("Try-With-Ressourcen enden");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SampleCloseAble implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Schließen der Closeable-Klasse()Lauf");
}
}
sys.out
Try-With-Ressourcen beginnen
Versuchen Sie die laufende Anweisung
Try-With-Ressourcen enden
Schließen der Closeable-Klasse()Lauf
Die nach Abschluss der Verarbeitung in der try-Anweisung implementierte Methode close wird aufgerufen. Beachten Sie jedoch, dass die Methode close vor der catch-Anweisung aufgerufen wird, wenn in der try-Anweisung eine Ausnahme auftritt (siehe unten).
SampleTryWithResources2.java
public class SampleTryWithResources2 {
public static void main(String[] args) {
try (SampleCloseAble sca = new SampleCloseAble()) {
System.out.println("Try-With-Ressourcen beginnen");
System.out.println("Versuchen Sie die laufende Anweisung");
throw new Exception();
} catch (Exception e) {
System.out.println("Versuchen Sie das Ende der Anweisungsausnahme");
e.printStackTrace();
}
}
}
sys.out
Try-With-Ressourcen beginnen
Versuchen Sie die laufende Anweisung
Schließen der Closeable-Klasse()Lauf
Versuchen Sie das Ende der Anweisungsausnahme
java.lang.Exception
at ...
Die Reihenfolge der Verarbeitung ist Verarbeitung in Try-Anweisung ⇒ AutoCloseable-Close-Methode ⇒ Verarbeitung in catch-Anweisung Wird sein.