Mechanizm try-with-resources został wprowadzony w Javie 7 do automatycznego zarządzania zamykaniem zasobów, takich jak strumienie wejścia-wyjścia czy połączenia z bazą danych. Ułatwia to pracę z zasobami i minimalizuje błędy przecieków.
Historia pytania:
Przed Javą 7 zamykanie zasobów musiało odbywać się ręcznie w bloku finally, co prowadziło do powielania kodu i błędów. Try-with-resources zautomatyzował ten proces, czyniąc kod czystszym i bezpieczniejszym.
Problem:
Jeśli zasób nie został jawnie zamknięty, może dojść do przecieku (np. nie zwolniono uchwytu pliku, połączenia z bazą danych). W starszej wersji często zapominali wywołać close() w bloku finally, szczególnie przy kilku wyjątkach.
Rozwiązanie:
Używać try-with-resources wszędzie tam, gdzie zasoby implementują interfejs AutoCloseable.
Przykład użycia:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line = reader.readLine(); // ... } catch (IOException e) { e.printStackTrace(); }
Podczas wychodzenia z bloku try, wywoła automatycznie close(), co gwarantuje poprawne zwolnienie zasobów.
Kluczowe cechy:
Czy można używać try-with-resources z wieloma zasobami?
Tak, można zadeklarować wiele zasobów oddzielając je średnikiem w jednym wierszu:
try ( InputStream in = new FileInputStream("a.txt"); OutputStream out = new FileOutputStream("b.txt") ) { // ... }
Czy muszę łapać wyjątki w try-with-resources?
Nie. Można nie podawać catch, jeśli w metodzie zadeklarowano rzucanie wyjątku lub jeśli obsługa nie jest wymagana, ale częściej catch jest potrzebny do odpowiedniej diagnostyki.
Czy można używać zmiennych zadeklarowanych poza try() jako zasobów dla try-with-resources?
Nie, zasoby muszą być zadeklarowane wewnątrz nawiasów try, w przeciwnym razie automatyczne zamykanie nie zadziała.
Kod otwiera FileInputStream bez try-with-resources, programista zapomina zamknąć strumień lub zamyka go tylko w przypadku braku błędów. W przypadku wyjątku strumień pozostaje otwarty.
Plusy:
Minusy:
Używano try-with-resources, zasób zadeklarowany bezpośrednio w nawiasach try, zwolnienie zawsze gwarantowane.
Plusy:
Minusy: