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,
- het declareren en instantiëren van de bron binnen de
try
clausule. - 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