Java Exceptions

JAVA’DA EXCEPTION

Exception, Türkçesi İstisna olan bir kelimedir ama Javadaki anlamı tam olarak karşılayabildiğini düşünmüyorum bu yüzden ben Türkçesini kullanmayacağım. Exception, bir programdaki istenmeyen durumlar ifade eder. Mesela, siz kullanıcıdan bir “yarıçap” değeri istediniz, fakat kullanıcı size 45 yazacağına 45t yazdı yanlışlıkla… Programınız böyle bir durumda ne yapacağını bilemez. İşte bu örnek bir istenmeyen durumdur.

Exception’lara örnek vermek istersek temel olarak en çok şunlarla karşılaşırsınız.
x Bir sayıyı 0(sıfır)’a bölmeye çalışma,
x Bir dizi’nin boyut sınırından ileride bir noktası ulaşmaya çalışma,
x Program içinde kullandığınız bir dosyanın ( file) istenen konumda bulunmaması,
x Dosya (input) okuma hataları,
x oluşturulmamış bir nesneye ulaşmaya çalışma,
x Güvenlik problemi oluşturabilecek bir programı çalıştırmaya çalışma

Bu durumlar, istenirse,
x ortaya çıkma ihtimali olan yerde halledilir.
x veya programın başka bir yerinde halledilmek üzere yönlendirilebilir.
x Bu ikisini de yapmayıp, hatalı bir durum oluştuğunda programınızın hata verip kapanmasını tercih edebilirsiniz.

Program tarafından yok sayılmış istisnalar, programın beklenmedik şekilde sonlanmasına neden olur. Bu sonlanma sırasında interpreter, metod çağırma sırasını tuttuğu yığını da ekrana basar. (stack trace) Bu yığında, hangi class’ın hangi metodunda, hangi satır çalıştırılırken bu durumla karşılaşıldığı belirtilir.

Şimdi de, icabına bakılmamış bir exception programımıza ne yaptırır görelim.

Gördüğünüz gibi, programda “10 / 0” işlemi yapıldı ve ArithmeticException aldık. “:” işaretinden sonra da bize problemin ne olduğunu söylemiş.
Altta gördüğünüz “at Zero.main….” satırı da stack’tir. Bizim bu kodda sadece bir tane metod çağırmış olduğumuz için tek satır var. Farkettiğiniz üzere konsol ekranında “Bu yazı ekrana basılmayacak :)” yok. 🙂

”try-catch(-finally)” bloğu
Exception ile karşılaşma ihtimalimiz olan yerlerde bu exception’ın üstesinden gelmek, gerekli işlemleri yapmak için try-catch bloğu kullanılır.

Bir try bloğunu birden fazla catch bloğu takip edebilir. Bu catch bloklarının her birisine Exception Handler(Exception Denetleyicisi) denilebilir. Bir exception meydana geldiğinde, uygun olan İLK catch bloğu çalışır.
Çalışma sürecini baştan ele alalım:
Program çalışıyor,
try bloğu çıktı,
___Buradan itibaren try bloğunun sonuna kadarki kısım aynı şekilde çalıştırılır. Eğer bir hata/beklenmedik durum meydana gelmişse, meydana geldiği yerde durur.
uyumlu ilk catch bloğu çalıştırılır.
___catch bloğundan sonra, varsa finally bloğu çalıştırılır.
program devam eder.
Aşağıdaki resimden de okuyunuz pekiştirilmiş olması için.

switch-case bloğuyla benzer düşünebilirsiniz. Onda da uygun olan ilk case işleniyordu(hatırlayın.)

Exception Taşıma
(exception ile oluştuğu yerde değil de başka bir yerde ilgilenmek)

Yukarıda bahsettiğimiz şeylerden bir tanesi:
Bir problem olduğunda, onun yığın izi(stack trace) ekrana basılır.

Bunu niye hatırlattık? Şöyle, siz bir exception olduğunda onunla oluştuğu yerde uğraşmak istemeyebilirsiniz. Mesela dosya okuma hatası ile oku(String dosyaAdi); gibi bir metodda karşılaştığınızda bu problemi orada çözmek kolay olmaz. Bu problemi, “oku” metodunu çağırdığımız yerde çözmeliyiz. (Tabi ki kodu nasıl yazdığınıza göre işler değişir her zaman.)
oku metoduna gönderdiğimiz dosya adının hatalı olduğunu düşünelim. Böyle bir durumda oku metodunu çağırdığımız yere, (diyelim ki) main metoduna, “Bana exception denk geldi. IOException hem de. Ben böyle bir dosya bulamadım. Elimden de bir şey gelmiyor. Sen uğraş bununla.” demesi lazım metodumuzun.
Örnek kod inceleyelim:

output:

Açıklama yapılacak çok fazla şey görmüyorum. Burada dikkatinizi çekmesi gereken kısım,
“Seviye 3 sonu” ve
“Seviye 2 sonu”

yazmayışıdır.
Programcı, exception ile hangi seviyede ilgileneceğini ve onu hangi seviyede yakalayacağını kendi seçmeli. Bu durumda yukarıda da söylediğim gibi, en doğru yoktur. Yazdığınız koda ve dizaynınıza göre değişir. Bazen doğru yaklaşım, programın hata verip kapanmasına izin vermek bile olabilir.

Buraya kadarki kısım, Exception Handling (~Exceptionların Üstesinden Gelme) denilen, exception ile ilgilenme kısmıydı. Buradan sonra da Exception classını inceleyeceğiz.

Exception Sınıfı
Kendi exception’larımızı, onları Exception sınıfına veya onun alt sınıflarından birine extend ederek yazarız. Şimdi de yine örnek bir kodla, kendi Exception classımızı oluşturalım ve başka bir kodda bu exceptionları fırlatalım. Böylece, hem Exception yazmayı, hem de fırlatmayı da öğrenmiş olacaksınız.

Exception ve Error classları, Throwable classının alt sınıflarıdır. Aşağıda bunların hiyerarşik düzenini inceleyebilirsiniz.

Burada bahsedilmesi gereken şey şudur:
Runtime Exception denilen Exceptionlar için
 throws yazılması gerekmez. Yukarıdaki kodlarda farkettiyseniz, “sıfıra bölme hatası olabilir. ArithmeticException ekle!” gibi bir uyarıyla karşılaşmadık. RunTimeException, Exception classının altında olmasına rağmen, “throws” yazılmasını gerektirmez. Bu yüzden bu exceptionlara ihtiyaç olup olmamadığının farkına varmak zordur.

Aşağıdaki örnek kodda, Kendi Exception sınıfımızı yazdık. Diğer kod parçasında da bu sınıfımızı kullandık. Daha iyi anlamak için inceleyin.

Exception classımız:

output:

Biraz uzadı konu ama…
Son bir örnek ile bırakıyorum.

Açıklama yazmadım. Yeterince açık olduğuna inanıyorum. İsteyen olursa başka bir mesaj içerisinde yazabilirim.


Yanlış anlaşılma olmasın, buradaki 3 class farklı dosyalarda olacak ama resim çektiğim için aynı yere koydum.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s