Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 2 z 210/14 w kursie~12 min
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.

Code
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.

Code
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().

Code
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

Ćwiczenie#java.m5.l2.e1
Próby: 0Ładowanie...

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'.

Ładowanie edytora...
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

Ćwiczenie#java.m5.l2.e2
Próby: 0Ładowanie...

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'.

Ładowanie edytora...
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

Ćwiczenie#java.m5.l2.e3
Próby: 0Ładowanie...

Zadeklaruj jednocześnie FirstResource i SecondResource w tej samej konstrukcji try-with-resources. Obsłuż wyjątek Exception, wypisując 'Error'.

Ładowanie edytora...
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