JAVA Programlama

İSTİSNALAR (EXCEPTION)

image_pdfimage_print

İstisnalar Nedir?

  • İstisnalar; Java ile geliştirdiğimiz uygulamaların, istenmeyen durumlar nedeniyle oluşacak hatalar topluluğuna verilen isimdir.
  • Java’da uygulamanın çalışma akışı esnasında meydana gelebilecek olası hataları tahmin etmek ve yakalayarak işleme alınmasına, istisnai durumların işlenmesi denir. Bu yapının asıl avantajı ise; hatayı bir sınıf içerisinde kapsülleyip, hatalar arasında hiyerarşik guruplar tanımlamaktır.

 

  • Java kütüphanesinde tanımlı üç ana istisnai durum gurubu bulunur.
  • Kontrol (Checked) istisnai durumları: Uygulamamızın içerisinde yakalanması gereken hata türleridir. Bu hata türlerini uygulamamızdan uzak tutarak, uygulamamızın sağlıklı bir şekilde çalışmasını sürdürmesini sağlayabiliriz.
  • Hatalar (Errors) istisnai durumları: İşletim sisteminde meydana gelen olayların sonucunda oluşan hata türleridir. Genellikle bu hatalardan geri dönmek imkansızdır. İşletim sisteminin çökmesi, hafıza yetmezliği vb. örnek verilebilir.
  • ÇALIŞMA zamanı (run time) İstisnai durumları: Mesela program içerisinde “x/a” gibi bir ifade oldugunu varsayalım. Bu durumda program derlenirken bu ifade hatalı olarak algılanmaz. Ancak program çalışırken a değişkenine 0 değeri atanırsa bu ifade matematiksel olarak sonsuz anlamına gelir ve bu da başka bir hata üretilmesine neden olur. İşte bu tur hatalara error değil “exception” adı verilir.

Örnek :

Çıktı:

 

 

 

 

 

  • Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
  • Bunun sebebi sayilar[ ] adli dizimizden 5’inci, yani olmayan bir elemanı çağırıyor olmamızdır.

Try-Catch Bloğu

 try{ // Istisnaya sebebiyet verebilecek olan kod  }

catch(Exception1 e1) {

//Exception1  için yapılacak işler  }

catch(Exception2 e2) {

// Exception2  için yapılacak işler}

finally{

// blok bitmeden yapılması istenen işler

}

  • try blokunda atılan hatayı catch bloku yakalar ve onun hangi tip olduğunu belirlemeye çalışır. Önce, hatanın  Exception1 tipinden olup olmadığına bakar. O tipten ise, istenen önlemleri alacak kodları çalıştırır. Değilse, hatayı kendisinden sonra gelen catch blokuna yollar. Bu süreç hata tipi belirlenene kadar arka arkaya devam eder. Eğer, hiçbir catch bloku hata ile uyuşmazsa, finally bloku gerekeni yapar. catch{} bloku bir tek olabileceği gibi, programcının istediği sayıda olabilir.
  • catch blokunda alt-sınıflardaki hatalar daima üst-sınıftaki hatalardan önce yazılmalıdır. Çünkü, catch deyimi, üst-sınıftaki hatalardan başlayarak alt-sınıflara doğru iner. Eğer üstlerde bir hata yakalamışsa, o hatayı atar ve alttaki hatalara ulaşamaz. Java’da erişilemeyen kodlar da hata atımına neden olur.

Örnek :

Bazı İstisnalar ;

  • ArithmeticException; Sıfıra bölme gibi aritmetik hata.
  • ArrayIndexOutOfBoundsException; Dizi indeksi sınırların dışındadır.
  • ArrayStoreException; Bir dizi elemanına, uyumsuz bir tipin atanması.
  • NegativeArraySizeException: Bir diziye boyut değeri olarak negatif bir değer verildiğinde oluşacak istisna tipidir.
  • IndexOutOfBoundsException; Bazı indeks tipleri sınırın dışındadır.
  • NegativeArraySizeException; Negatif boyutta oluşturulan dizi.
  • TypeNotPresentException; Tip Bulunamadı.

İSTİSNA MESAJLARI

  • getMessage(): Oluşan istisnaya ait bilgileri döndürür.

Çıktı:

 

 

 

 

  • getLocalizedMessage(): Bu metod Exception sınıfından türetilmiş alt sınıflar tarafından iptal (override) edilebilir. Java’da kendi istisna sınıfımızı yazabiliriz. Kendimize ait istisna sınıfı yazdığımızda, bu metodu iptal (override) ederek getMessage() metod çıktısını elde edebiliriz. Yani bu metodun çıktısı getMessage() metodu ile aynıdır.
  • toString(): Oluşan istisna hakkında açıklama döndürür. Bu açıklama istisna ifadesini belirtir.

Örnek: 

Çıktı:

 

 

 

  • printStackTrace(): Oluşan istisnayla ilgili sınıf bilgisi ve hatanın oluştuğu satır numarasını verir. Bu metod void tipindedir. Bu nedenle geri dönüş değeri yoktur.

Örnek: 

Çıktı:

 

 

 

 

  •  printStackTrace(PrintStream s), printStackTrace(PrintWriter s): Hata mesajları genellikle log dosyalarına yazdırılır. PrintStream ve PrintWriter sınıfına ait nesneleri kullanarak, hata mesajlarını dosyalara yazdırmamız mümkün.
  • getStackTrace(): Hatanın hangi sınıfta, hangi dosyada, hangi fonksiyonda ve hangi satırda oluştuğu hakkında bilgi verir.

THROWS NEDİR ?

  • Eğer bir metot yakalayamadığı bir istisnaya neden olursa, metodu çağıranların kendilerini istisnaya karşı koruyabilmeleri için çağıran metodun bu davranışı belirtmesi gerekir. Bunu metodun bildirimine bir throws ifadesi ekleyerek yapabilirsiniz. throws ifadesi bir metodun fırlatabileceği istisna tiplerini belirtir. Eğer belirtilmez ise derleme zamanı hatası alınır.
  • throws ifadesinin genel formu aşağıdaki gibidir.

tip metot_adi (parametreler) throws istisna_listesi {

//metot gövdesi  }

  • Burada istisna_listesi metodun fırlatabileceği istisna tiplerinin virgülle ayrılmış halidir.

THROW NEDİR ?

  • Yazdığımız Java programında açıkcathrow ifadesini kullanarak bir istisna fırlatmak mümkündür. throw ifadesinin genel formu aşağıdaki gibidir.

                                     throw FırlatılabilirNesne;

  • Burada FirlatilabilirNesne, Throwable veya onun herhangi bir alt sınıfı tipinde bir nesne olmak zorundadır. Throwable olmayan String, Object, Int, Char.. gibi tipler istisna olarak kullanılamaz. Throwable bir nesne elde etmenin iki yolu vardır. Birinci yolu catch cümleciği içinde parametre olarak kullanılabilir ya da new operatörü ile yeni bir nesne oluşturabilirsiniz.
  • Programın işleyişi throw ifadesinden hemen sonra durur ve sonra hiçbir ifade çalıştırılamaz. Kapsayan en yakın try bloğunda istisna tipiyle eşleşen bir catch cümleciği aranır. Bulunmaz ise sıradaki kapsayan try bloğu denetlenir. Denetleme try bloklarının sonuna kadar devam eder. Eğer istisna tipiyle eşleşen bir catch bulunamazsa program durur.

Örnek: 

  • Bu program aynı hatayı yakalamak için iki şansa sahiptir. Birincisi main() metodunun içinde çağırılan olustur_firlat metodunun try bloğunda hata oluşturulur ve catch bloğunda yakalanır. İkincisi main() metodunun içindeki catch bloğudur. Örnek kodumuzda kullanılan new kelimesini hata nesnesi oluşturmak için kullanırız.

Kendi istisnalarımızı nasıl oluşturabiliriz?

  • Java’nın yerleşik istisnaları pek çok yaygın hatayı yönetebilmesine rağmen, uygulamalarınıza özgü durumları yönetmek için kendi istisna tiplerinizi oluşturmak isteyebilirsiniz.Yalnızca Exception sınıfının (bu da Throwable’ın alt sınıfıdır) bir alt sınıfını tanımlamak yeterlidir. Alt sınıflarınız aslında herhangi bir şeyi uygulamak zorunda değildir(tip sisteminde bulunuyor olmaları, onları istisna olarak kullanmamızı sağlar).
  • Exception sınıfı kendisinin bir metodunu tanımlamaz. Throwable tarafından sağlanan metotları kalıtım yoluyla devralır. Bu sebeple, oluşturduğunuz istisnalar da dahil olmak üzere tüm istisnalar, Throwable tarafından kendileri için kullanılabilir olarak tanımlanan metotlara sahiptir.

 

 

 

  • İlk form herhangi bir açıklaması olmayan bir istisna oluşturur. İkinci form istisna için bir açıklama belirtebilmenizi sağlar.
  • Bir istisna oluştururken açıklama belirtmek genellikle yararlı olsa da, bazen toString()metodunu devre dışı bırakmak daha iyidir. Bunun nedeni şudur: toString() metodunun Throwable tarafından tanımlanan(ve Exception tarafından devralınan) versiyonu önce istisnanın adını, sonra bir tane iki nokta işareti ve sonra da açıklamanızı görüntüler. toString() metodunu devre dışı bırakarak istisna adının ve iki nokta işaretinin görüntülenmesini önleyebilirsiniz. Bu, daha temiz bir çıktı sağlar ve bazı durumlarda daha çok tercih edilir.

 

 

 

 

 

 

  • Sınıf içerisinde biri parametre almak suretiyle iki yapılandırıcı tanımlanmıştır. Dikkat ederseniz ikinci yapılandırıcı bir parametre alıyor ve kendisine gelen değeri super metodu ile üst sınıfı olan Exception sınıfı yapılandırıcısına gönderiyor. Kendi istisnamızı oluşturma amaçlı tasarladığımız bu sınıf içerisinde kapsamlı metodlar yazabiliriz. Ayrıca Exception sınıfına ait metodları da iptal (override) edebiliriz.

finally Bloğu 

  • Bir işlemin her koşulda – istisna olsun ya da olmasın – kesin olarak yapılmasını istiyorsak finally bloğu kullanmalıyız.

finally {

// ne olursa olsun calisacak kod buraya

}

finally Bloğu ve return Deyimi

  • finally bloğu her zaman çalıştırılır. Örneğin bir yordam hiçbir şey döndürmüyorsa (void) ama bu yordamın içerisinde yordamı sessizce terk etmek amacı ile return ifadesi kullanılmış ise, finally bloğu içerisindeki kodlar bu return ifadesi devreye girmeden hemen önce çalıştırılır.

Örnek:

  • calis() yordamına gönderilen parametre eğer sıfırsa, bu yordam çalışmasını sona erdiriyor fakat finally bloğu içerisindeki kodlar bu durumda bile çalıştırılmaktadır.  Dikkat edilmesi gereken bir başka nokta ise calis() yordamının bilerek birşey döndürmemesidir -void- olmasıdır. Çünkü eğer calis() yordamı birşey – ör: String tipi- döndüreceğini söyleseydi, geri döndürme (return) işlemini finally bloğunun içerisinde yapması gerekirdi, aksi takdirde derleme anında (compile-time) uyarı alınırdı. Yani bir yordamın içerisinde try – finally blok sistemi tanımlanmış ise try bloğunda return ile bir değer geri döndürülmesine izin verilmez. Uygulamanın çıktısı aşağıdaki gibidir.

 

 

 

 

 

 

System.exit() Komutu

  • Eğer System sınıfının statik bir yordamı olan exit()  çağrılırsa finally bloğuna hiç girilmez. System.exit() yordamı uygulamanın içerisinde çalıştığı JVM’i (Java virtual machine) kapatır. Anlatılanları bir uygulama üzerinde incelersek.

  • Bu örneğimizin bir öncekine göre tek farkı returnyerine System.exit() komutunun yazılmış olmasıdır. System.exit() komutu, uygulamanın içerisinde çalıştığı JVM’i kapattır. exit() yordamına gönderilen eksi bir değer JVM’in anormal bir sonlanmış yapacağını ifade eder. Bu çok ağır bir cezalandırmadır. Normalde uygulamanın bu şekilde sonlandırılması pek tercih edilmemektedir ancak tek başına çalışan uygulamalarda kullanıcının yanlış parametre girmesi sonucu kullanılabilir.

Aşağıdakilere dikkat ediniz:

  1. Bir catch koşulu, try ifadesi olmadan var olamaz.
  2. try/catch bloğu olsa bile, finally koşulu kullanmak zorunlu değildir.
  3. Catch koşulu veya finally koşulu olmazsa, try bloğu olmaz.

 

PowerPoint Sunusunu  linkten indirebilirsiniz.

 

 

İSTİSNALAR (EXCEPTION)

Kaynaklar:

Hazırlayan: Hilal TAŞKIRAN

1
0

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir