Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java proberen-met-bronnen

Java try-with-resources

In deze zelfstudie leren we over de instructie try-with-resources om bronnen automatisch te sluiten.

De try-with-resources statement sluit automatisch alle bronnen aan het einde van het statement. Een bron is een object dat aan het einde van het programma moet worden afgesloten.

De syntaxis is:

try (resource declaration) {
  // use of the resource
} catch (ExceptionType e1) {
  // catch block
}

Zoals blijkt uit de bovenstaande syntaxis, declareren we de try-with-resources verklaring van,

  1. het declareren en instantiëren van de bron binnen de try clausule.
  2. alle uitzonderingen specificeren en afhandelen die kunnen optreden bij het sluiten van de bron.

Opmerking: De instructie try-with-resources sluit alle bronnen die de AutoCloseable-interface implementeren.


Laten we een voorbeeld nemen dat de try-with-resources . implementeert verklaring.

Voorbeeld 1:try-with-resources

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());
    }
  }
}

Uitvoer als het test.txt-bestand niet wordt gevonden.

IOException in try-with-resources block =>test.txt (No such file or directory)

Uitvoer als het test.txt-bestand is gevonden.

Entering try-with-resources block
Line =>test line

In dit voorbeeld gebruiken we een instantie van BufferedReader om gegevens te lezen van de test.txt bestand.

De BufferedReader declareren en instantiëren binnen de try-with-resources statement zorgt ervoor dat zijn instantie wordt gesloten, ongeacht of de try instructie wordt normaal voltooid of genereert een uitzondering.

Als er een uitzondering optreedt, kan deze worden afgehandeld met behulp van de exception handling blocks of het throws-sleutelwoord.


Onderdrukte uitzonderingen

In het bovenstaande voorbeeld kunnen uitzonderingen worden gegenereerd vanuit de try-with-resources verklaring wanneer:

  • Het bestand test.txt is niet gevonden.
  • De BufferedReader sluiten voorwerp.

Er kan ook een uitzondering worden gegenereerd vanuit de try blokkering als een bestand lezen kan op elk moment om vele redenen mislukken.

Als er uitzonderingen worden gegenereerd vanuit zowel de try blok en de try-with-resources statement, uitzondering van de try blok wordt gegenereerd en uitzondering van de try-with-resources verklaring is onderdrukt.

Onderdrukte uitzonderingen ophalen

In Java 7 en later kunnen de onderdrukte uitzonderingen worden opgehaald door de Throwable.getSuppressed() . aan te roepen methode van de uitzondering gegenereerd door de try blok.

Deze methode retourneert een array van alle onderdrukte uitzonderingen. We krijgen de onderdrukte uitzonderingen in de catch blok.

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]);
  }
}

Voordelen van het gebruik van try-with-resources

Dit zijn de voordelen van het gebruik van try-with-resources:

1. eindelijk blokkeren niet vereist om de bron te sluiten

Voordat Java 7 deze functie introduceerde, moesten we de finally . gebruiken blok om ervoor te zorgen dat de bron is gesloten om bronlekken te voorkomen.

Hier is een programma dat lijkt op Voorbeeld 1 . In dit programma hebben we eindelijk blokkering gebruikt om bronnen te sluiten.

Voorbeeld 2:Sluit bron met gebruik van definitief blokkeren

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());
      }

    }
  }
}

Uitvoer

Entering try block
Line =>line from test.txt file
Entering finally block 

Zoals we uit het bovenstaande voorbeeld kunnen zien, is het gebruik van finally blok om bronnen op te schonen maakt de code complexer.

Let op de try...catch blok in de finally ook blokkeren? Dit komt omdat een IOException kan ook optreden tijdens het sluiten van de BufferedReader instantie binnen deze finally blok zodat het ook wordt opgevangen en behandeld.

De try-with-resources statement doet automatisch resourcebeheer . We hoeven de bronnen niet expliciet te sluiten, omdat JVM ze automatisch sluit. Dit maakt de code leesbaarder en gemakkelijker te schrijven.


2. try-with-resources met meerdere bronnen

We kunnen meer dan één bron aangeven in de try-with-resources statement door ze te scheiden met een puntkomma ;

Voorbeeld 3:probeer met meerdere bronnen

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());
      }
    }
  }
}

Als dit programma wordt uitgevoerd zonder uitzonderingen te genereren, Scanner object leest een regel uit de testRead.txt bestand en schrijft het in een nieuwe testWrite.txt bestand.

Als er meerdere aangiften worden gedaan, wordt de try-with-resources statement sluit deze bronnen in omgekeerde volgorde. In dit voorbeeld is de PrintWriter object wordt eerst gesloten en daarna de Scanner object is gesloten.


Java 9 try-with-resources verbetering

In Java 7 is er een beperking op de try-with-resources uitspraak. De bron moet lokaal binnen zijn blok worden gedeclareerd.

try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
  // code
}

Als we de bron buiten het blok in Java 7 hadden gedeclareerd, zou het een foutmelding hebben gegenereerd.

Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
  // code
}

Om deze fout op te lossen, heeft Java 9 de try-with-resources . verbeterd statement, zodat de referentie van de resource kan worden gebruikt, zelfs als deze niet lokaal is gedeclareerd. De bovenstaande code wordt nu uitgevoerd zonder enige compilatiefout.


Java

  1. Java-operators
  2. Java-opmerkingen
  3. Java if... else-instructie
  4. Java voor elke lus
  5. Java-onderbrekingsverklaring
  6. Java-strings
  7. Java-interface
  8. Java anonieme klasse
  9. Java-annotaties
  10. Java-beweringen
  11. Java-vector