6 Mayıs 2014 Salı

Try-Catch Kullanımı

 



Exception Handling (Hata çözümlenmesi):

Programlamada hatalar kaçınılmaz, ufak bir kod yazarken bile hata alma olasılığı oldukça yüksek. Biz hataları ne kadar düzeltmeye çalışsak da son kullanıcının kullanımını bilmediğimiz için çoğunlukla gözümüzden kaçan noktalar oluyor.  Bu yazıda çalışma zamanı hatalarını(exception, error ile karıştırılmamalı) ve onları çözümlemenin yolunu anlatacağım.

Öncelikle birkaç terimi açıklamalıyım;
 1) Exception: Beklenmeyen hatalara(istisna) verilen isimdir. Errordan farkı ise bu hataları tahmin edip, yakalayıp o hatalarla karşılaştığınızda ne yapacağınızı belirleyebilmenizdir. Error durumunda ise durumu tahmin edip onu yönetemezsiniz.

2) Error:  Bu hata JVM(Java Virtual Machine) seviyesindedir. Kontrol edilmez çünkü bu uygulama seviyesinde bir hata değildir. Örneğin  OutOfMemoryError hatası(hafıza bitimi) oluştuğunda programın yapabileceği bir şey yoktur. Yani bu hatalar oluştuğunda programın kapatılması gerekir.

3) Catching: Oluşan istisnayı yakalayıp oluşan sorunu çözme adına yapılan işlemlerdir

4) Throwing: Oluşan exception durumunda exception objesi oluşturulup programa fırlatılma işlemidir.

5) Catch Block:  Oluşan exceptionda ne yapılacağı yazılan bloklardır. { //do something  }

Kullanım Talimatları:
* Programda exception(istisna) oluşturabilecek yerleri  try bloğuna alınır. Gereksiz yere tüm kodu try bloğuna almamalıyız çünkü bu boş yere performans kaybı yaşatır. Bunun yerine if bloklarını tercih etmeliyiz.
* Oluşabilecek hataları ön görüp onlara göre catch blokları yazılır. Her catch bloğu yakalayabileceği istisnayı belirler ve ona göre işlem yapar.
* Eğer istisna oluşsa da oluşmasa da belirlediğiniz bir kod parçasının çalışmasını istiyorsanız o kodu
finally bloğuna almalısınız.

1) Try Bloğu: Programımızda hata çıkabilecek olan yerleri içinde barındır bloktur. Eğer bir istisna oluşursa istisna objesi oluşturup fırlatır.

2) Catch Bloğu: Yaşanan istisnalarda ne yapılacağını belirleyen blok/bloklardır. Fırlatılan objeye uygun olan catch bloğu objeyi yakalar ve sorunu çözmek için programcının yazdığı kodları işlemeye başlar.

3) Finally Bloğu: Kodunuzda istisna oluşsa da oluşmasa da çalıştırılacak olan kod bloğudur.
Finally bloğuna gerek olmadığını düşünebiliriz çünkü catchin altına ne yazarsak yazalım çalışıyor. Fakat bazı yerlerde gerek var örneğin  catch ifadesinde bir şeyi  return edersem o zaman alttaki ifadeye geçmez fakat finally kullanırsam return etsem dahi finally çalışır. Yani ne olursa olsun finally bloğu çalışır!

-Oluşan hatalar nedir?
Öncelikle hataların hiyerarşik yapısını anlayalım;


Aslında hatalar  Checked ve Unchecked Exception olarak ikiye ayrılıyor.

Error ve RuntimeException  unchecked exception, diğer kısım ise checked exception olarak adlandırılır. Java Unchecked exception'ı handle etmeye zorlamıyor fakat checked exceptionları handle etmeye zorluyor. Eğer handle etmezsek kodu derlemiyor.

Hataları açıklarsak;
+ArithmeticException: Matematiksel hatalar. örneğin 0 a bölünememe durumu gibi.
+ArrayIndexOutOfBoundsException: Dizinin olmayan bir indisine erişme durumunda ortaya çıkan hata.
+NullPointerException: Olmayan bir şeyi işaret ettiğimizde çıkar. Örneğin  int a; demeden if(a==5) dersek bu hatayı alırız. 
+ClassCastException: Bir objeyi illegal bir şekilde cast edersek bu hatayı alırız.(Downcasting)
+ IOException: Örneğin diskten bir metin belgesinin ilk satırını okuyan bir programımız var. Ama okuyacağımız dosya ya diskte yoksa ya da ilk satırı yoksa? İşte bu hata o zaman karşımıza çıkar

Konu bu kadar, örnek vererek pekiştirelim.

 ArithmeticException örneği;


 Eğer bunu try-catch yapısı ile yakalamasaydık şöyle bir hata alacaktık;


Daha önce de belirttiğim gibi bu kadar ufak şeyler için try-catch yapısını kullanmaya gerek yok, bunun yerine if bloğunu kullanarak bölenin 0 olup olmama durumunu kontrol etmeliyiz.

ArrayBoundsOfException örneği;
Try-Catch kullanmadan önceki hali:



Try-Catch kullandıktan sonra;



0 yorum:

Yorum Gönder