Try-catch-finally mekanizması, Java'nın başlangıcından itibaren hata işleme için eklenmiştir. Temel amacı, hata yönetimini yapılandırmak ve çalışma kodu ile hata işleme kodunu ayırmaktır.
Problem: Herhangi bir standart dışı veya hatalı davranış, bir istisna (exception) fırlatılmasına yol açar. Try-catch olmadan, yalnızca çağrı yığınına yukarı doğru iletebilirsiniz. Bu yaklaşımla program çökebilir.
Çözüm — try { } catch { } finally { } kullanımı, beklenen istisnaları işlemek ve her zaman sonlandırıcı işlemleri (kaynakları serbest bırakma, dosyaları kapatma, işlemleri geri alma) gerçekleştirmek için olanak tanır.
Kod örneği:
try { FileInputStream fin = new FileInputStream("test.txt"); int data = fin.read(); } catch (IOException e) { System.out.println("Dosya ile çalışırken hata: " + e.getMessage()); } finally { fin.close(); }
Anahtar özellikler:
try bloğu potansiyel olarak hatalı kod içerircatch istisnaları yakalar ve işlerfinally her zaman çalıştırılır, return/istisna olsa bileFinally çalışmaz mı?
Evet, eğer blok içinde System.exit() varsa, işlem aniden sonlanır veya JVM fiziksel olarak çökerse çalışmaz.
Finally olmadan try-catch kullanmak mümkün mü?
Evet, finally bloğu zorunlu değildir. Ancak kaynakların temizlenmesi gerekiyorsa genellikle kullanılır. Java 7 ile birlikte try-with-resources vardır.
Finally içinde bir istisna olursa ne olur?
Eğer finally içinde yeni bir hata oluşursa, bu orijinal hatayı "örtbas eder" (eğer ayrı olarak yakalanmadıysa), bu sorunları maskeleyebilir.
try { throw new RuntimeException("try içinde hata"); } finally { throw new RuntimeException("finally içinde hata"); } // Nihai stacktrace — sadece "finally içinde hata"
catch(Exception e) {} boş)throw e; yeni bir Exception(e) olmadan)Projede finally bloğu, kendisi IOException fırlatabilen bir kod içeriyordu. Try'daki bir hata durumunda orijinal istisna tamamen kayboldu ve hata teşhisi zorlaştı.
Artılar:
Eksiler:
Finally yerine takım, try-with-resources'a geçti. Her kaynak AutoCloseable'ı uyguluyor, serbest bırakma otomatik olarak gerçekleşiyor, istisnalar kendi hatalarıyla loglanıyor.
Artılar:
Eksiler: