Modulelessen (2/2)
Probeer-met-middelen
In oudere versies van Java was voor het beheren van bronnen waarvoor expliciete sluiting nodig was (zoals bestanden, databaseverbindingen of netwerkstreams) een verplicht finally blok nodig om ervoor te zorgen dat ze gesloten waren. Dit leidde tot uitgebreide en lekgevoelige code.
Java 7 introduceerde de instructie try-with-resources, die de automatische sluiting garandeert van alle bronnen die binnen het blok try zijn gedeclareerd, op voorwaarde dat ze de interface AutoCloseable implementeren.
De syntaxis
Bronnen worden tussen haakjes gedeclareerd en geïnitialiseerd onmiddellijk na het trefwoord try.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occursMeerdere bronnen declareren
U kunt meerdere bronnen instantiëren binnen hetzelfde try blok, waarbij u ze scheidt met een puntkomma ;. De bronnen worden gesloten in omgekeerde volgorde van hun aangifte.
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Use resources
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}Aangepaste bronnen maken
Een aangepaste bron kan worden gebruikt in een try-with-resources blok, zolang deze java.lang.AutoCloseable implementeert en de methode close() overschrijft.
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Running query: " + sql);
}
@Override
public void close() {
System.out.println("Connection closed!");
}
}Probeer het zelf
Voltooi de readFile-methode met behulp van de try-with-resources-instructie om een BufferedReader te initialiseren die een FileReader op pad wikkelt. Onderschep in het catch-blok IOException en druk 'Fout bij lezen bestand' af.
Toon hint
Declareer de `BufferedReader` tussen haakjes direct na `try`, en implementeer de afhandeling van `IOException`.
Oplossing beschikbaar na 3 pogingen
Instantieer de aangepaste bron CustomResource in een try-with-resources-blok, roep de doWork()-methode erop aan en handel Exception af door 'Error' af te drukken.
Toon hint
Gebruik `try (CustomResource res = new CustomResource())` en roep `res.doWork();` erin aan.
Oplossing beschikbaar na 3 pogingen
Declareer zowel FirstResource als SecondResource in dezelfde try-with-resources-constructie. Behandel uitzonderingen door 'Fout' af te drukken.
Toon hint
Scheid de declaratie van de twee bronnen binnen de haakjes van `try` met behulp van een puntkomma `;`.
Oplossing beschikbaar na 3 pogingen