16. İstisnalar(Exceptions)
İstisna, programın çalışması sırasında ortaya çıkan bir sorundur. Bir istisna, bir çok değişik nedenden dolayı meydana gelebilir, aşağıdaki gibi:
- Kullanıcı geçersiz bir veri girebilir.
- Açılması geren dosya bulunamayabilir.
-
İletişimin ortasından ağ bağlantısı kaybolabilir veya JVM belleği tükenebilir.
Bu istisnaların bazılarına kullanıcı hatası sebep olur, diğerleri programcının hatası ve fiziksel kaynaklardan dolayı olabilir.
İstisna işlemenin Java’da nasıl çalıştığını anlamak için, istisnaların üç kategorisini anlamanız gerekmektedir.
- Kontrol edilmis istisnalar(Checked exceptions):Kontrol edilmiş istisnalar, genellikle kullanıcı hatları veya programcı tarafından öngörülememiş sorunlardır. Örnek olarak, bir dosya açılacak ancak dosya bulunamıyorsa, istisna meydana gelir.
- Çalışma anındaki istisnalar(Runtime exceptions):Çalışma anındaki istisnalar, muhtemelen programcı tarafından önlenebilir istisnalardır.
-
Hatalar:Başlı başına istisna değildir, kullanıcı veya programcının kontrolü dışında ortaya çıkan sorunlardır. Örnek, bir stack overflow meydana gelirse, bir hata ortaya çıkacaktır. Bunlar, derleme süresinde yok sayılır.
16.1 İstisna Hiyerarşisi
Bütün istisna sınıfları, java.lang.Exception sınıfının alt türleridir. Exception sınıfı, Throwable sınıfının alt sınıfıdır. Throwable sınıfından elde edilen diğer bir alt sınıfta Error sınıfıdır. Hatalar, normalde Java programları tarafından tutulmazlar. Bu koşullar normalde java programları tarafından işlenmeyen ciddi başarısızlık durumunda meydana gelirler. Hatalar, çalıştırma ortamı tarafından oluşturulan hataları belirtmek için oluşturulur.Örnek: JVM belleği tükenmiş. Normalde programlar hatalardan kurtulamaz.Exception sınıfı iki ana altsınıfa sahiptir:
- IO Exception Sınıfı
- RuntimeException Sınıfı
16.2 Java Dahili İstisnaları
En genel istisnalar, standart tip RuntimeException sınıfının alt sınıflarıdır. Java, çeşitli sınıf kütüphaneleri ile ilgili bir çok türde istisna tanımlar. Aşağıdaki liste, Unchecked RuntimeException’ları göstermektedir.
|Exception||Description|
|ArithmeticException||Aritmetic hata, sıfıra bölünme gibi|
|ArrayIndexOutOfBoundsException||Dizi index’i sınırların dışında.|
|ArrayStoreException||Dizi elemanına uyumsuz türde atama.|
|ClassCastException||Geçersiz cast.|
|IllegalArgumentException||Metodu çalıştırmak için illegal argüman.|
|IllegalMonitorStateException||Illegal monitor işlemi, unlocked bir thread üzerinde bekleme gibi .|
|IllegalStateException||Ortam veya uygulama doğru olmayan durumda.|
|IllegalThreadStateException||İstenen işlem anlık thread durumu ile uyumlu değil.|
|IndexOutOfBoundsException||Bazı türde index sınır dışında.|
|NegativeArraySizeException||Dizi negatif boyutta yaratılmış|
|NullPointerException||Null referansının geçersiz kullanımı.|
|NumberFormatException||Bir string’in sayısal formata geçersiz dönüşümü|
|SecurityException||Güvenlik ihlali denemesi.|
|StringIndexOutOfBounds||Bir stringe sınırları dışında index verme|
|UnsupportedOperationException||Desteklenmeyen işlem karşılatırıldı.|
Aşağıdaki liste, Javada ki CheckedException’ları göstermektedir:
|Exception||Description|
|ClassNotFoundException||Sınıf bulunamadı.|
|CloneNotSupportedException||Nesne kopyalama, Kopyalanabilir arayüzde uygulanamadı.|
|IllegalAccessException||Sınıfa erişim engellendi.|
|InstantiationException||Abstract bir sınıf veya arayüzde nesne oluşturma.|
|InterruptedException||Bir thread, diğer bir thread tarafından kesildi.|
|NoSuchFieldException||İstenen dosya yok.|
|NoSuchMethodException||İstenen metot yok.|
16.3 İstinaları Yakalamak
Bir metot, try ve catch anahtar kelimelerinin kombinasyonunu kullanarak bir istisnayı yakalayabilir. Try/catch bloğu, istisna oluşması muhtemel kodun etrafına yerleştirilir.
Try/catch bloğu içindeki kod, korumalı kod(protected code) olarak adlandırılır ve
try/catch kullanımı aşağıdaki gibidir:
Bir catch ifadesi, yakalamak istediğiniz istisnanın deklare edilmiş türünü içerir. İstisna korumalı kod içinde oluşuyorsa, catch bloğu(veya blokları), try bloğunu kontrol eder. Eğer istisna türü catch bloğu içinde listelenmiş istisnalardan biriyse, istisna catch bloğuna geçirilir.
Örnek:
Aşağıdaki dizi, 2 elemanlı bir dizi olarak deklare edilmiştir. Ardından kod, 3. elemente erişmeyi deniyor. Burada bir istisna oluşmaktadır:
Bu aşağıdaki sonucu üretecektir:
16.4 Birden çok catch Bloğu
Bir try bloğu, birden çok catch bloğu tarafından takip edilebilir. Birden çok catch bloğunun syntax’ı aşağıdaki gibidir:
Önceki ifadeler üç catch bloğu göstermektedir, ama siz tek bir try bloğundan sonra herhangi bir sayıda catch bloğu kullanabilirsiniz. Eğer istisna korumalı kod içinde meydana gelirse, listedeki ilk catch bloğuna atılır. Atılan istisnanın veri tipi ExceptionType1 ile eşleşiyorsa, burada yakalanır. Eşleşmiyorsa, istisna ikince catch bloğuna geçer. Bu işlem istisna yakalanana kadar devam eder, bu durumda metot çalışmayı durdurur ve istisna call stack üzerindeki bir önceki metodu altına alır.
Örnek:
Birden çok try/catch ifadesinin kullanımını gösteren kod parçası:
16.5 throws/throw Anahtar Kelimeleri
Eğer bir metot kontrol edilmiş bir istisnayı işleyemiyorsa, o zaman throws anahtar kelimesi kullanarak deklare etmek zorundadır. throws anahtar kelimesi metot imzasının sonunda görülür. Throws anahtar kelimesi istisnayı bir başka sınıfa gönderir.
Aşağıdaki metot bir RemoteException atmanın deklare edilmesidir:
Bir metot, birden çok istisnanın atılmasını deklare eder, bu durumda istisnalar virgülle ayrılarak bir listede deklare edilir. Örnek, aşağıdaki metot bir RemoteException ve bir InsufficientFundsException atılmasını deklare ediyor:
16.6 finally Anahtar Kelimesi
finally anahtar kelimesi, try bloğunun ardından gelen bir kod bloğu oluşturmak için kullanılır. Bir finally kod bloğu, istisna olsa da olmasa da, her zaman çalışır.
Catch bloklarından sonra gelen finally bloğunun syntax’ı şu şekildedir.
Örnek:
Bu aşağıdaki sonucu üretecektir:
Aşağıdakilere dikkat edin:
- Bir catch koşulu, try ifadesi olmadan var olamaz.
- try/catch bloğu olsa bile, finally koşulu kullanmak zorunlu değildir.
- Catch koşulu veya finally koşulu olmazsa, try bloğu olmaz.