Programcıların en çok canını sıkan konuların başında yazılım hatalarının yakalanması ve yönetilmesi gelmektedir. Çünkü iyi bir programcı oluşabilecek her hatayı önceden kestirip, bu hataları önlemeye yönelik tedbirler almak zorundadır. Java’da hata yönetiminin temellerini try, catch ve finally blokları oluşturur.
Blokların kullanımını kısaca anlatmak gerekirse; istisnai bir durum oluşabileceğini öngördüğümüz kodları try bloğu içine alırız. Eğer böyle bir durum oluşursa program kırılmak yerine hatayı bloktan dışarı fırlatır. Bu fırlatılan hata catch blokları tarafından yakalanır ve makul bir şekilde yönetilir. Finally bloğunda ise try veya catch bloklarından sonra mutlaka çalıştırılmasını istediğimiz kodlar yer alır. Finally bloğunun kullanılıp kullanılmaması durumu programcının isteğine bırakılmıştır.
Bir istisna yönetim bloğunun genel yapısı şu şekildedir.
1 2 3 4 5 6 7 8 9 |
try{ //Hata oluşması beklenen kod bloğu } catch(hata tipi){ // Bu hatanın yönetilmesi için gerekli kod bloğu } finally{ //Hata oluşsada oluşmasada son olarak çalıştırılacak kod bloğu } |
Konunun daha iyi anlaşılabilmesi için bir örnek üzerinden anlatalım. Klavyeden girdiğimiz iki sayıyı birbirine bölen ve sonucu ekranda gösteren basit bir uygulama yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package kodlamamerkezi.com; import java.util.InputMismatchException; import java.util.Scanner; public class MatematikselIslemler { publicstaticvoid main(String[] args) { try { Scanner sc=new Scanner(System.in); System.out.println("1.sayıyı girin:"); doublebolunen=sc.nextDouble(); System.out.println("2.sayıyı girin:"); doublebolen=sc.nextDouble(); doublesonuc=bolunen/bolen; System.out.println("Sonuç="+sonuc); } catch (InputMismatchException e) { System.out.println("Lütfen sadece sayı giriniz."); } finally{ System.out.println("İşlem sonlandı."); } } } |
Evet kullanıcıdan aldığı ilk sayıyı, ikinci sayıya bölen ve sonucu gösteren basit bir program yaptık. Kodlarımızın çalışma şeklini inceleyelim.
1.durum: Kullanıcının iki sayı girdiğini varsaydığımız durumda, programımız hatasız çalışır. Sırasıyla, hesaplanan sonuç değişkeni ekrana yazdırılır, catch bloğu çalıştırılmaz, finally bloğundaki mesaj ekrana yazdırılır ve program kapanır.
2.durum: Kullanıcının iki sayı yerine yanlışlıkla farklı değerler girdiği programda ise yine program hatasız çalışır. Sırasıyla kullanıcı yanlış değer girip “Enter”a bastığı anda direk catch bloğuna atlanır, hata mesajı ekrana yazdırılır, finally bloğundaki mesaj ekrana yazdırılır ve program kapanır.
Bu iki durumla ilgili ekran çıktıları aşağıdaki gibi olacaktır.

Catch bloğu içerisindeki “InputMismatchException” istisnai durumunu inceleyelim. Bu istisnai durum kullanıcıdan gelen verinin atanmaya çalışan değişken türüne uymadığı durumlarda meydana gelir.
Buna benzer en çok karşınıza çıkacak hata türleri şunlardır.
ArithmeticException: Sıfıra bölme gibi aritmetik hatalar
ArrayIndexOutOfBoundsException: Dizinin sınırları dışına çıkma hatası
NullPointerException: Null değerinin geçersiz kullanılması
FileNotFoundException: İstenen dosyanın bulunamaması hatası
En çok karşılaşacağınız hata sınıflarını yazmaya çalıştım. Fakat bunlardan başka onlarca hata sınıfı bulunmaktadır. Hepside Exception sınıfından türetilmiştir.
Bir Hatanın Detaylarını Görüntülemek
Throwable, bir istisnanın açıklamasını içeren bir karakter katarı döndürmek için toString() metodunu ezer ve açıklamayı argüman olarak döndürür. Bu şekilde println metoduyla açıklama ekrana yazdırılabilir. Bir istisnai durum yakalandığı zaman, bu hatayla ilgili teknik bilgileri görmek için catch bloğumuzu aşağıdaki gibi değiştirebiliriz.
1 2 3 |
catch (Exception e) { System.out.println("Lütfen sadece sayı giriniz."+ e); } |
Bu örnekteki hata açıklaması, çok yararlı olmasa da özellikle yazılımcılara hata ayıklama aşamasında önemli katkı sağlamaktadır.
Birden Çok Catch İfadesi Kullanımı
Bazen try içerisindeki kod bloğunda, birden çok hata oluşabilecek durum meydana gelebilir. Böyle durumları kotarmak için birden fazla catch cümleciği arka arkaya kullanılır. Bir hata meydana geldiği anda, her catch ifadesi sırasıyla denetlenir ve istisnanın tipiyle uyuşan catch cümleciği çalıştırılır.
Yukarıda yaptığımız örneği aşağıdaki gibi tekrar yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package kodlamamerkezi.com; import java.util.InputMismatchException; import java.util.Scanner; public class MatematikselIslemler { publicstaticvoid main(String[] args) { try { Scanner sc=new Scanner(System.in); System.out.println("1.sayıyı girin:"); doublebolunen=sc.nextDouble(); System.out.println("2.sayıyı girin:"); doublebolen=sc.nextDouble(); doublesonuc=bolunen/bolen; System.out.println("Sonuç="+sonuc); } catch (InputMismatchException hata1) { System.out.println("Lütfen sadece sayı giriniz."); } catch(ArithmeticException hata2) { System.out.println("Bölen sayı 0 olamaz"); } finally{ System.out.println("İşlem sonlandı."); } } } |
Örnek incelendiğinde 2 farklı catch bloğunun yer aldığı görebilirsiniz. İkinci catch bloğu bölen sayının 0 olması durumda fırlatılan hatanın yakalanması için oluşturulmuştur. Try bloğu içerisinde hangi hata türü oluşmuşsa fırlatılan hata o catch bloğu tarafından yakalanır ve yönetilir.
Birden fazla catch ifadesi kullanıldığında en üst catch ifadesi Exception türünde olursa, alt satırlardaki catch ifadeleri gereksiz olur. Çünkü diğer istisnaların tümü Exception sınıfından türetildiği için tüm hatalar en üstteki catch bloğu tarafından yakalanır.
Çok nadir olsa da bazı durumlarda iç içe try-catch ifadeleri de kullanılabilmektedir.
Konuyla ilgili sorularınızı bana iletebilirsiniz. Hiç hata vermeyen programlar yazmanız dileğiyle…