ProgramlamaBackend Geliştirici

Java'da try-with-resources nedir, klasik try-catch-finally bloğundan farkı nedir ve ne zaman kullanılmalıdır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Java'daki try-with-resources'un ana görevi kaynakların otomatik ve doğru bir şekilde serbest bırakılmasıdır. Bu yapı Java 7'de ortaya çıkmadan önce, programcıların kaynakları manuel olarak finally bloğunda kapatmaları gerekiyordu. Bu, kodun tekrarlanmasına ve sık hatalara yol açıyordu.

Konunun Tarihi

Java 6 ve altındaki sürümlerde, kaynakları (açık dosyalar, akışlar, bağlantılar) manuel olarak finally ile yönetmek gerekiyordu, bu da sıklıkla bellek sızıntısına yol açıyordu.

Sorun

Manuel olarak yazılan kaynak kapatma kodu, özellikle birden fazla istisna ve karmaşık bir catch bloğu hiyerarşisi ile çalışırken hata kaynaklarıdır. Hatalar oluştuğunda close() çağrılma garantisi yoktur.

Çözüm

Java 7 ile birlikte kaynakların otomatik olarak close() metodunun her bir kaynak için çağrılmasını garanti eden try-with-resources sözdizimi ortaya çıktı, bu, AutoCloseable arayüzünü uygulayan her kaynak için geçerlidir.

Kod örneği:

try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader otomatik olarak kapatılır

Ana özellikler:

  • Tüm kaynaklar istisnalar oluşsa bile garantiyle kapatılır.
  • Yalnızca AutoCloseable arayüzünü uygulayan nesneler try-with-resources'ta kullanılabilir.
  • Şablon kodu basitleşir ve kısalır, bellek sızıntısı olasılığı azalır.

Kandırmaca Soruları.

Soru 1: Try-with-resources için bir kaynağın hangi arayüzü uygulaması gerekir?

AutoCloseable. Bu arayüzü uygulayan (veya Closeable) her nesne bu yapıda kullanılabilir.

Soru 2: Eğer try-with-resources'ta birden fazla kaynak varsa, hangisi hangi sırayla kapatılır?

Kaynaklar bildirildikleri sıranın tersinde (yığın-LIFO) kapatılır:

try (A a = new A(); B b = new B()) { ... } // önce b.close() çağrılacak, ardından a.close()

Soru 3: Try-with-resources'ı AutoCloseable uygulanmamış, örneğin bir ağ bağlantısı için kullanmak mümkün mü?

Hayır, ancak kendi sınıfınızda AutoCloseable'ı manuel olarak uygulayabilirsiniz. Sonrasında nesne try-with-resources ile uyumlu hale gelir.

Yaygın Hatalar ve Anti-Paternerler

  • close() içinde fırlatılan istisnaları işlemeyi unutur.
  • AutoCloseable'ı uygulamayan sınıflarla try-with-resources kullanır.
  • Eski kodda, eski finally kullanan kapatılmamış kaynaklar.

Hayattan Bir Örnek

Olumsuz Durum

Geliştiriciler JDBC Bağlantısı ve Statement'ı finally ile manuel olarak kapatıyordu. İkinci bir istisna durumunda, Statement kapatma işlemi gerçekleşmedi, bağlantı "asılı kaldı" ve hatayı gizledi.

Artılar:

  • Kapatma sırası üzerinde kontrol.
  • Kaynakların açıkça yönetimi.

Eksiler:

  • Kaynağı kapatmayı unutma riski.
  • Bağlantı sızıntıları.

Olumlu Durum

Dosya yükleme modülünde try-with-resources uygulamasından sonra tüm akışlar otomatik olarak kapatılıyor, kod çok daha kısa hale geldi, dosya tanıtıcı sızıntı hataları ortadan kalktı.

Artılar:

  • Güvenilirlik.
  • Kodun kısalığı.
  • Kolay test edilebilirlik.

Eksiler:

  • AutoCloseable uygulama gereksinimi.
  • Eski Java sürümlerinde hemen mevcut değil.