ProgramlamaBackend geliştirici

Java'da kontrol edilen ve edilmemiş istisnalar arasındaki farklar nelerdir, hata işlemesini nasıl doğru tasarlamalıyız ve bunları kullanırken hangi hatalardan kaçınmalıyız?

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

Cevap

Java'da istisnalar kontrol edilen (checked) ve edilmemiş (unchecked) olarak sınıflandırılır.

  • Kontrol edilen istisnalarException sınıfından türetilmiştir ama RuntimeException sınıfından değil. Derleyici, bunların açıkça try-catch ile işlenmesini veya throws ile bildirilmesini zorunlu kılar.
  • Edilmemiş istisnalarRuntimeException sınıfından türetilmiştir. Derleyici, bunların zorunlu işlenmesini talep etmez.
public void readFile(String file) throws IOException { /* ... */ } // kontrol edilen public void divide(int a, int b) { int res = a/b; } // edilmemiş (ArithmeticException)

Ana incelik — kontrol edilen istisnalar, beklenen, kurtarılabilir durumlar için kullanılır (örneğin, girdi/çıktı hataları), oysa edilmemiş istisnalar, program mantığı hataları veya kurtarılamayacak kritik durumlar için kullanılır (örneğin, NullPointerException).

Altyazanlı Soru

Soru: Eğer metodunuz edilmemiş bir istisna fırlatıyorsa, bunu işlemek veya throws ile bildirmek gerekir mi?

Cevap: Hayır. Derleyici, kurtarılamayan (unchecked) istisnaları kontrol etmeyi veya bildirmeyi zorunlu kılmaz. Bunların işlenmesi sizin takdirinize bağlıdır; try-catch kullanabilirsiniz ama genellikle "düşmelerine" izin vermek, hatta küresel işleyiciye kadar ulaşmalarını sağlamak tercih edilir.

public void foo() { throw new IllegalArgumentException(); } // işlenmesi veya bildirilmesi gerekmez

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Bir banka API projesinde, girdi/çıktı hataları işlenirken RuntimeException fırlatıldı, bunun yerine kontrol edilen istisna kullanılmadı. Sonuç olarak, müşteriler bunları işlemek zorunda kalmadı, bu da sunucu ile bağlantı kaybı durumunda yanlış çalışmaya yol açtı ve uygulama kullanıcıya bilgi vermeden "düştü".


Hikaye

Bir geliştirici, metodların imzasında gereksiz sayıda throws Exception bildirdi (örneğin, veritabanı için), bu nedenle yukarıda kullanılan tüm metodlar ya try-catch yapmak ya da aynı şekilde throws bildirmek zorunda kaldı. Bu, kodu kirletti, okunabilirliği kötüleştirdi ve refaktoringi zorlaştırdı.


Hikaye

Bir mikroserviste, tüm istisnaları genel catch (Exception e) ile yakaladılar. Bu, edilmemiş istisnaları (örneğin, NullPointerException) da yakalayarak kritik hataların "sessizce" göz ardı edilmesine neden oldu — hizmet, hatalı verilerle çalışıyordu.