•
Programlar hatalı kod bloklarında beklenmedik durumlar ortaya çıkarabilir.
•
Yeni programlama dillerinde hata
yönetim mekanizmaları (exception handling mechanism) kullanılmaktadır.
•
Hata yönetim mekanizmaları daha güçlü
ve esnek bir şekilde beklenmedik durumların yönetimini sağlar.
İstisna Yakalama
•
İstisnalar, hatalı durumların
yakalanmasını ve kontrol edilmesini sağlarlar.
•
java.lang.Exception sınıfından türetilir.
•
Herhangi bir kod bloğunda hatayla
karşılaşan kod istisna fırlatır (throw an exception)
•
Hatanın kontrol edilmesini sağlayan kod
bloğu da istisnayı yakalar. (catch the exception)
Java’da istisnalar Throwable sınıfından türetilir ve hiyerarşiye sahiptir.
Java çalışma ortamı, sıfıra bölme girişimine rastladığı zaman, yeni bir istisna nesnesi oluşturur(/by zero)ve bu istisnayı fırlatır. Java’da istisnalar Throwable sınıfından türetilir ve hiyerarşiye sahiptir.
Java Throwable Hiyerarşisi |
class ExpClass { public static void main(String args[]) { int sayi_1 = 0; int sayi_2 = 42 / sayi_1; System.out.println(«İstisna yakalanıyor…»); } }
İstisna Yaşam Döngüsü
- Bir istisna fırlatıldığında, bir istisna yöneticisi tarafından yakalanarak yönetilmelidir.
- İstisna yakalanana kadar metot çağırım yığınında (method call stack) yukarı doğru ilerler.
- Oluşan bir istisna Java çalışma ortamı tarafından sağlanan varsayılan istisna yöneticisi tarafından yakalandığı an hatanın başladığı yerden itibaren istisna yığın izi ekrana yazdırılır ve program akışı yarıda kesilir.
public static void main(String args[]) { int sayi_1, sayi_2; try { sayi_1 = 0; sayi_2 = 42 / sayi_1; System.out.println("Bunu ekrana basmayacak…"); } catch (ArithmeticException e) { System.out.println("Sıfıra bölme hatası aldınız…"); } System.out.println("Tanımlı diger catch bloklarına geçiş yapılır…"); }
Sınıf Metotlarındaki İstisnalar
Metotlar bir istisna fırlatabileceklerini throws ifadesi ile belirtirler ve bu metotları çağıran metotlar, ya
bu istisnayı yakalamalıdır ya da throws ifadesini kullanmalıdır.
class ExpClass { static void byZeroMethod() { int sayi_1 = 0; int sayi_2 = 10 / sayi_1; } public static void main(String args[]) { ExpClass.byZeroMethod(); } }
Yığın İzi(Stack Trace)
İstisna yakalanana kadar metot çağırım yığınında(method call stack) yukarı doğru ilerler.
İstisnanın yığın izini printStackTrace() metodunu kullanarak ekrana yazdırılır.
public static void main(String args[]) { int sayi_1, sayi_2; try { sayi_1 = 0; sayi_2 = 42 / sayi_1; System.out.println("Bunu ekrana basmayacak…"); } catch (ArithmeticException e) { e.printStackTrace(); } System.out.println("Tanımlı diger catch bloklarına geçiş yapılır…"); }
‘throw’ Deyimi ile İstisna Fırlatma
throw anahtar kelimesi ile kendi istisnalarımızı
oluşturabiliriz.
boolean hatam; if (hatam) throw new Exception("Benim Hatam");
Farklı İstisna Tiplerinin Yakalanması
Birden fazla catch ifadesi kullanılarak farklı istisna tiplerinin farklı şekillerde kontrol edilmesi sağlanabilir.İstisna sadece ilk uyumlu catch ifadesi tarafından kontrol edilir.
try { } catch (ExceptionSubClass e) { // ExceptionSubClass istisna işlendiğinde bu blok çalışır. } catch (Exception e) { // ExceptionSubClass haricinde bu blok çalışır. }
Bu kod bloğunda Exception ve ExcepitonSubClass
catch deyimlerinin yerleri değişince oluşacak hatayı görebilirsiniz.
Finally Deyimi
İstisna oluşması durumunda bile çalışması istenilen kod blokları finally içerisinde yazılır.
try { } catch (Exception e) { } finally { // catch bloğuna girdikten sonra bu blok çalışır. }
Bir sonraki yazımda görüşmek üzere…