Lekcje modułu (2/2)
Try-with-resources
W starszych wersjach Javy zarządzanie zasobami wymagającymi jawnego zamknięcia (takimi jak pliki, połączenia z bazą danych czy strumienie sieciowe) wymagało obowiązkowego użycia bloku finally w celu zapewnienia ich zamknięcia. Prowadziło to do powstania bardzo rozbudowanego (verboso) kodu i sprzyjało wyciekom pamięci (memory leaks).
Począwszy od Javy 7 wprowadzono konstrukcję try-with-resources, która gwarantuje automatyczne zamknięcie wszystkich zasobów zadeklarowanych wewnątrz bloku try, o ile implementują one interfejs AutoCloseable.
Składnia
Zasoby są deklarowane i inicjalizowane wewnątrz nawiasów okrągłych tuż po słowie kluczowym try.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("Errore di I/O: " + e.getMessage());
}
// br viene chiuso automaticamente qui, anche se si verifica un'eccezione
Deklarowanie wielu zasobów
Możliwe jest utworzenie instancji wielu zasobów wewnątrz tego samego bloku try, oddzielając je średnikiem ;. Zasoby zostaną zamknięte w kolejności odwrotnej do ich deklaracji.
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Utilizzo delle risorse
} catch (IOException e) {
System.out.println("Errore: " + e.getMessage());
}
Tworzenie własnych zasobów
Własny zasób może być użyty w konstrukcji try-with-resources, o ile implementuje interfejs java.lang.AutoCloseable i nadpisuje metodę close().
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Eseguo query: " + sql);
}
@Override
public void close() {
System.out.println("Connessione chiusa!");
}
}
Spróbuj sam
Uzupełnij metodę readFile, używając konstrukcji try-with-resources do zainicjalizowania obiektu BufferedReader, który opakowuje FileReader na ścieżce path. W bloku catch przechwyć IOException i wypisz 'Error reading file'.
Pokaż wskazówkę
Zadeklaruj `BufferedReader` w nawiasach okrągłych tuż po słowie kluczowym `try` i przechwyć `IOException`.
Rozwiązanie dostępne po 3 próbach
Utwórz instancję własnego zasobu CustomResource wewnątrz bloku try-with-resources, wywołaj na nim metodę doWork() i obsłuż wyjątek Exception, wypisując 'Error'.
Pokaż wskazówkę
Użyj `try (CustomResource res = new CustomResource())` i wywołaj wewnątrz `res.doWork();`.
Rozwiązanie dostępne po 3 próbach
Zadeklaruj jednocześnie FirstResource i SecondResource w tej samej konstrukcji try-with-resources. Obsłuż wyjątek Exception, wypisując 'Error'.
Pokaż wskazówkę
Rozdziel deklaracje obu zasobów wewnątrz nawiasów okrągłych `try` za pomocą średnika `;`.
Rozwiązanie dostępne po 3 próbach