Java'da istisnalar kontrol edilen (checked) ve edilmemiş (unchecked) olarak sınıflandırılır.
Exception 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.RuntimeException 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).
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
Hikaye
Bir banka API projesinde, girdi/çıktı hataları işlenirken
RuntimeExceptionfı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 Exceptionbildirdi (ö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.