İstisnalar \(Exceptions\)

advertisement
İstisnalar (Exceptions)
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
1
İstisna deyince aklınıza ne geliyor ?
• “Diğerlerinin yazdığı programda hata
olabilir ama benim yazdığım programda
hata olmaz... “ - Anonim
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
2
Tam bir uygulama yazmak nasıl olur ?
• Bir uygulamanın, üzerine düşen işleri yapması
onu tam bir uygulama yapar mı ?
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
3
Tam bir uygulama
• Doğruluk
• Sağlamlık
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
4
Doğruluk- ilk şart
• İki sayıyı bölmeye yarayan bir uygulama
geliştirmeniz istendi.
• A / B = Sonuç Æ çok kolay
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
5
Sağlamlık-unutulan şart
• Dışarıdan istenmeyen veriler girildiği zaman
uygulamanız nasıl bir davranış sergiliyecektir
?
–5 / 0 = ?
– 10 / elma = ?
– armut / erik = ?
• Uygulamanız aniden kapanacak mı ? Yoksa
bunları bölmeye mi kalkacak ?
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
6
Java ve sağlamlık şarttı
• Java Programlama dili oluşabilecek olan
istisnalara karşı önlem alınmasını ister.
– Açılmak istenen dosya yerinde olmayabilir.
– Ağ (network) bağlantısı kopmuş olabilir.
– Okunmak istenen dosyanın içi boş olabilir.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
7
İstisna nasıl oluşabilir ?
DiziErisim.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
8
İstisna yakalama mekanizması
try {
// istisnaya sebebiyet verebilecek olan kod
} catch(Exception1 e1) {
//Eğer Exception1 tipinde istisna firlatılırsa buraya
} catch(Exception2 e2) {
//Eğer Exception2 tipinde istisna firlatılırsa buraya
}
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
9
Örnekler
DiziErisim2.java
DiziErisim3.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
10
İstisna İfadeleri
• Bir yordamın iki seçeneği vardır
– Oluşan istisnayı yakalayabilir (hata yakalama
mekanizması kullanarak)
– Oluşan istisnayı bir üst kısma fırlatabilir.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
11
Örnek-1
IstisnaOrnek1.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
12
Örnek-2
IstisnaOrnek2.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
13
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
14
Örnek-3
IstisnaOrnek3.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
15
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
16
Örnek-4
IstisnaOrnek4.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
17
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
18
Örnek-5
IstisnaOrnek5.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
19
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
20
İstisna tip hiyerarşisi
• Nasıl olur da java.io.IOException istisna
tipi, java.io.FileNotFoundException istisna
tipini kapsayabilir ?
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
21
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
22
Üç ana tip
• Error
• RuntimeException
• Ve diğer Exception tipleri (önceden tedbir
alınmaları gerekir)
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
23
Error
• Error istisna tipi ölümcül bir hatayı işarettir ve
telafisi çok zordur; neredeyse imkansızdır.
• Örneğin OutOfMemoryError istisna tipi,
bellekten dolayı bir istisna meydana gelmiş ise
uygulamanın buna müdahale edip düzeltmesi
imkansızdır.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
24
RuntimeException
• RuntimeException istisna tipleri, eğer uygulama
normal seyrinde giderse ortaya çıkmaması
gereken istisna tipleridir.
• ArrayIndexOutOfBoundsException istisna tipi, bir
dizinin olmayan elemanına eriştiğimiz zaman ortaya
çıkan bir istisnadır.
• RuntimeException istisna tipleri, yanlış kodlamadan
dolayı ortaya çıkan bir istisnadır.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
25
Ve diğer Exception tipleri
• Bu istisna tipleri çevresel koşullardan dolayı meydana
gelebilir.
• Örneğin erişilmeye çalışılan dosyanın yerinde
olmaması (FileNotFoundException) veya ağ
(network) bağlantısının kopması sonucu ortaya
çıkabilecek olan istisnalardır. Bu istisnalar için
önceden tedbir alınması şarttır.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
26
Tüm diğer Exception istisna tiplerini yakalamak
catch (Exception ex) {
// ......
}
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
27
RuntimeException istisna tipleri
• DiziErisim.java uygulama örneğimiz
içerisinde istisna oluşma riski olmasına
rağmen nasıl oldu da Java buna kızmayarak
derledi ? Peki ama IstisnaOrnek1.java
uygulamasını niye derlemedi ?
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
28
RuntimeException istisna tipleri
• Java Programlama Dili, RuntimeException
istisna tiplerini yakalamak için bir baskı
yapmaz.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
29
RuntimeException istisna tipleri nelerdir ?
•
•
•
•
•
AritmeticException
NullPointerException
NegativeArraySizeException
ArrayIndexOutOfBoundsException
SecurityException
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
30
AritmeticException
• Bir sayının sıfıra bölünmesiyle ortaya
çıkabilecek olan RuntimeException istisna tipi.
int i = 16 / 0 ; // AritmeticException ! hata !
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
31
NullPointerException
• Bir sınıf tipindeki referansı, o sınıfa ait bir
nesneye bağlamadan kullanmaya kalkınca
alınabilecek bir istisna tipi.
String ad ;
System.out.println("Ad = " + ad.trim() ); // ! hata !
Bu hatayı almamak için ;
String ad = " Java Kitap Projesi "; // bağlama işlemi
System.out.println("Ad = " + ad.trim() ); //dogru
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
32
NegativeArraySizeException
• Bir diziyi negatif bir sayı vererek oluşturmaya
çalışırsak bu istisna tipi ile karşılaşırız.
int dizi[] = new dizi[ -100 ]; //! hata !
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
33
ArrayIndexOutOfBoundsException
• Bir dizinin olmayan elemanına ulaşmak
istendiği zaman karşılaşılan istisna tipi
• Daha detaylı bilgi için DiziErisim.java
uygulama örneğini incelenebilir.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
34
SecurityException
• Genellikle tarayıcı (browser) tarafından fırlatılan bir
istisna tipidir. Bu istisnaya neden olabilecek olan
sebepler aşağıdaki gibidir ;
– Applet içerisinden, yerel bir dosyaya erişmek istedendiği
zaman.
– Applet’in indirildiği sunucuya değil de değişik bir
sunucuya ağ (network) bağlantısı kurulmaya çalışıldığı
zaman.
– Applet’in kendi içerisinde başka bir uygulama başlatmaya
çalıştığı zaman.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
35
İstisna Mesajları
• Bir istisna nesnesinden bir çok veri elde
edilebilir.
• Örneğin istisna oluşumunun yol haritası
izlenebilir veya istisna oluşana kadar hangi
yordamlar çağrılmış gibi değerli bilgiler
görülebilir.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
36
İstisna Mesajları
• String getMessage() : Oluşan istisnaya ait
bilgileri String tipinde geri döner.
• String getLocalizedMessage(): Bu
yordam, Exception sınıfından türetilmiş alt sınıflar
tarafından iptal edilebilir (override).
• String toString(): Oluşan istisna hakkında
kısa bir açıklamayı String tipinde geri döner.
– Oluşan istisna nesnesinin tipini ekrana basar
– ": " iki nokta üst üste koyar ve bir boşluk bırakır.
– Son olarak getMassege() yordamı çağrılır ve
buradan - eğer bilgi varsa ekrana basılır.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
37
Örnek-1
IstisnaMetodlari.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
38
İstisna Mesajları - Java 1.4
• Throwable getCause(): Bu yordamın
işe yaraması için istisna sınıfına ait
yapılandırıcının içerisine bu istisnaya sebebiyet
vermiş olan istisna tipini yerleştirmek
gerekmektedir.
IstisnaMetodlari2.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
39
İstisna Mesajları - Java 1.4
• Throwable initCause( Throwable cause) :
İki yarı istisna tipini birleştirmeye yarar. Eğer bir
istisna Throwable(Throwable) veya
Throwable(String, Throwable) ile oluşturulmuş
ise initCause() yordamı çağırılamaz.
IstisnaMetodlari3.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
40
İstisna Mesajları
• printStackTrace() : Throwable sınıfının bu yordamı
sayesinde oluşan bir istisnanın yol haritasını görebiliriz.
• printStackTrace( PrintStream s ) : PrintStream
sınıfına ait nesne kullanılarak oluşan istisnanın yol
haritasını konsol yerine başka bir yere bastırmanız
mümkündür.
• printStackTrace( PrintWriter s ) : PrintWriter
sınıfına ait nesne kullanılarak, oluşan istisnanın yol
haritasını konsol yerine başka bir yere bastırmanız
mümkündür. JSP ve Servlet lerde kullanılabilir.
IstisnaMetodlari4.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
41
Kendi İstisnalarımızı Nasıl Oluşturabiliriz?
• Java’nın kendi içerisinde tanımlanmış istisna
tiplerinin dışında bizler de kendimize özgü istisna
tiplerini oluşturup kullanabiliriz.
• Sonuçta istisnalar da birer nesnedir ve kendilerine
has durumları olabilir.
BenimHatam.java
SeninHatan.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
42
Örnek
Kobay.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
43
Ekran Çıktısı
---------------------Hata Olustu-1:sonuc eksi
! onemli hata !
2
---------------------Hata Olustu-2:SeninHatan:
b parametresi sifir geldi
---------------------Hata Olustu-2:SeninHatan
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
44
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.
FinallyOrnek1.java
FinallyOrnek2.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
45
return ve finally Bloğu
• 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 return
ifadesi kullanılmış ise, finally bloğu, bu
return ifadesi devreye girmeden hemen
önce çalıştırılır.
ReturnOrnek.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
46
Dikkat System.exit();
• Eğer System sınıfının statik bir yordamı olan
exit() çağrılırsa finally bloğuna hiç
girilmez.
SystemExitOrnek.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
47
İstisnanın Tekrardan Fırlatılması
• Oluşan bir istisnayı catch bloğunda
yakaladıktan sonra tekrardan bir üst kısma
fırlatmanız mümkündür.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
48
Gösterim
try {
// riskli kod
} catch (Exception ex){
System.out.println("istisna yakalandi: " + ex);
throw ex; // dikkat
}
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
49
Örnek
TekrarFirlatimOrnek1.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
50
İlginç Gelişme
• Oluşan bir istisna her zaman fırlatılamayabilir.
FirlatimOrnek1.java
FirlatimOrnek2.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
51
Çözüm
FirlatimOrnek3.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
52
İptal Etme (Overrride) ve İstisnalar
• İptal etme şartları
– İptal eden yordamın, iptal edilen yordam ile aynı
parametrelere,
– Aynı isme,
– Üst sınıfa ait yordamın erişim belirleyicisinden
daha erişilebilir veya aynı erişim belirleyicisine
sahip olması gerekir.
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
53
Örnek
AB.java
CD.java
EF.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
54
İstisnaların Sıralanması
• Bir istisna catch bloğunda veya catch
bloklarında yakalanırken, istisnaların
hiyarerşik yapılarına dikkat edilmelidir.
IstisnaSiralamasi.java
IstisnaSiralamasi2.java
IstisnaSiralamasi3.java
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
55
Sorular ...
© Altuğ B. Altıntaş 2003
Java ve Yazılım Tasarımı - Bölüm 8
56
Download