Java-Versuch-mit-Ressourcen
Java try-with-Ressourcen
In diesem Tutorial lernen wir die try-with-resources-Anweisung zum automatischen Schließen von Ressourcen kennen.
Der try-with-resources
-Anweisung schließt automatisch alle Ressourcen am Ende der Anweisung. Eine Ressource ist ein Objekt, das am Ende des Programms geschlossen werden soll.
Seine Syntax ist:
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Wie aus der obigen Syntax ersichtlich, deklarieren wir die try-with-resources
Aussage von,
- Deklarieren und Instanziieren der Ressource innerhalb von
try
Klausel. - Festlegen und Behandeln aller Ausnahmen, die beim Schließen der Ressource ausgelöst werden könnten.
Hinweis: Die try-with-resources-Anweisung schließt alle Ressourcen, die die AutoCloseable-Schnittstelle implementieren.
Nehmen wir ein Beispiel, das den try-with-resources
implementiert Erklärung.
Beispiel 1:Versuch-mit-Ressourcen
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
Ausgabe, wenn die Datei test.txt nicht gefunden wird.
IOException in try-with-resources block =>test.txt (No such file or directory)
Ausgabe, wenn die Datei test.txt gefunden wird.
Entering try-with-resources block Line =>test line
In diesem Beispiel verwenden wir eine Instanz von BufferedReader um Daten aus dem test.txt
zu lesen Datei.
Deklarieren und Instanziieren des BufferedReader innerhalb der try-with-resources
-Anweisung stellt sicher, dass ihre Instanz geschlossen wird, unabhängig davon, ob die try
Anweisung wird normal abgeschlossen oder löst eine Ausnahme aus.
Wenn eine Ausnahme auftritt, kann sie mit den Blöcken zur Ausnahmebehandlung oder dem Schlüsselwort throws behandelt werden.
Unterdrückte Ausnahmen
Im obigen Beispiel können Ausnahmen von try-with-resources
ausgelöst werden Anweisung wann:
- Die Datei
test.txt
nicht gefunden. - Schließen des
BufferedReader
Objekt.
Eine Ausnahme kann auch von try
ausgelöst werden Das Blockieren als Datei kann jederzeit aus vielen Gründen fehlschlagen.
Wenn Ausnahmen sowohl von try
ausgelöst werden Block und die try-with-resources
Anweisung, Ausnahme von try
Block wird geworfen und Ausnahme von try-with-resources
Anweisung wird unterdrückt.
Unterdrückte Ausnahmen abrufen
In Java 7 und höher können die unterdrückten Ausnahmen durch Aufrufen von Throwable.getSuppressed()
abgerufen werden -Methode aus der von try
ausgelösten Ausnahme blockieren.
Diese Methode gibt ein Array aller unterdrückten Ausnahmen zurück. Die unterdrückten Ausnahmen erhalten wir in catch
blockieren.
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
Vorteile der Verwendung von Try-with-Ressourcen
Hier sind die Vorteile der Verwendung von try-with-resources:
1. final Block zum Schließen der Ressource nicht erforderlich
Bevor Java 7 diese Funktion einführte, mussten wir den finally
verwenden blockieren, um sicherzustellen, dass die Ressource geschlossen wird, um Ressourcenlecks zu vermeiden.
Hier ist ein Programm, das Beispiel 1 ähnelt . In diesem Programm haben wir jedoch den finally-Block verwendet, um Ressourcen zu schließen.
Beispiel 2:Ressource mit finally-Block schließen
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
Ausgabe
Entering try block Line =>line from test.txt file Entering finally block
Wie wir im obigen Beispiel sehen können, ist die Verwendung von finally
Block zum Bereinigen von Ressourcen macht den Code komplexer.
Beachten Sie die try...catch
Block im finally
auch sperren? Dies liegt daran, dass ein IOException
kann auch beim Schließen des BufferedReader
auftreten Instanz in diesem finally
blockieren, damit es auch gefangen und behandelt wird.
Der try-with-resources
-Anweisung automatische Ressourcenverwaltung . Wir müssen die Ressourcen nicht explizit schließen, da JVM sie automatisch schließt. Dadurch wird der Code besser lesbar und einfacher zu schreiben.
2. try-with-resources mit mehreren Ressourcen
Wir können mehr als eine Ressource im try-with-resources
deklarieren -Anweisung, indem Sie sie durch ein Semikolon ;
trennen
Beispiel 3:Versuchen Sie es mit mehreren Ressourcen
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
Wenn dieses Programm ausgeführt wird, ohne Ausnahmen zu generieren, Scanner
Objekt liest eine Zeile aus testRead.txt
Datei und schreibt sie in einen neuen testWrite.txt
Datei.
Bei mehreren Deklarationen wird der try-with-resources
-Anweisung schließt diese Ressourcen in umgekehrter Reihenfolge. In diesem Beispiel der PrintWriter
Objekt wird zuerst geschlossen und dann der Scanner
Objekt ist geschlossen.
Java 9 try-with-resources-Verbesserung
In Java 7 gibt es eine Beschränkung auf try-with-resources
Aussage. Die Ressource muss lokal innerhalb ihres Blocks deklariert werden.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Wenn wir die Ressource in Java 7 außerhalb des Blocks deklariert hätten, hätte dies eine Fehlermeldung generiert.
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
Um diesen Fehler zu beheben, hat Java 9 den try-with-resources
verbessert -Anweisung, sodass die Referenz der Ressource verwendet werden kann, auch wenn sie nicht lokal deklariert ist. Der obige Code wird nun ohne Kompilierungsfehler ausgeführt.
Java