Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

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,

  1. Deklarieren und Instanziieren der Ressource innerhalb von try Klausel.
  2. 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:

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

  1. Java-Operatoren
  2. Java-Kommentare
  3. Java if...else-Anweisung
  4. Java for-each-Schleife
  5. Java-Strings
  6. Java-Schnittstelle
  7. Anonyme Java-Klasse
  8. Java-Anmerkungen
  9. Java-Assertionen
  10. Java-Vektor