7. Bölüm Sıradışı Durum Yönetimi (Exception Handling)

advertisement
y
ca
de
m
Java ile Nesne Merkezli ve Fonksiyonel
Programlama
w
w
w
.s
el
so
f
t.a
7. Bölüm
Sıra Dışı Durum Yönetimi
(Exception Handling)
Akın Kaldıroğlu
www.javaturk.org
Aralık2016
ca
de
m
y
Küçük Ama Önemli Bir Konu
Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm
w
Ø
w
Ø
w
.s
el
so
f
Ø
t.a
Ø
haklarıSelsoft Yazılım,Danışmanlık,EğitimveTic.Ltd.Şti.’ne aittir.
Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla
kullanabilirsinizveisteyenlerihttp://www.selsoft.academy adresine
yönlendirip,bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz.
Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari
olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması,
buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada
sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde
lütfenbenimle,[email protected] adresindeniletişimegeçin.
Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve
eleştirilerinizibanailetmekistersenizçoksevinirim.
BolJava’lıgünlerdilerim.
www.selsoft.academy
2
ca
de
m
y
İçerik
Ø Bubölümde şu konular ele alınacaktır:
t.a
Ø Geleneksel sıra dışı durumyönetimi,
Ø Java’da sıra dışı durumyönetimi,
so
f
Ø Throwable sınıf hiyerarşisi,
Ø Exceptionve Errorsınıfları,
savunmacı programlama,
Ø Sıra dışı durumyönetiminin eniyi kullanımları.
w
w
w
.s
el
Ø assertanahtar kelimesi ve
www.selsoft.academy
3
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Sıra Dışı Durum (Exception)
www.javaturk.org
4
y
ca
de
m
SıraDışıDurumNedir?
Ø Yazılımdasıradışı durum (exception),normalçalışmadan
birsapmadır.
w
.s
el
so
f
t.a
Ø Sıradışıdurumlar,yazılımlarınçalışmasısırasında,icra
edilensüreçlerdebeklenen veolmasıgerekenlerdışında
meydanagelenanormalhallerdir.
Ø Kredikartıylaödemeyaparkenkartınlimitininyetmemesi bir
sıradışıdurumdur.
w
w
Ø Yazılımlarabuhalleriyönetmekiçinyapılarbulunur.
Ø Buyapılarasıradışı durumyönetimi (exception handling)
denir.
www.javaturk.org
5
ca
de
m
y
SıraDışıDurumNedenOlur?
w
w
w
.s
el
so
f
t.a
Ø Önemliolansıradışıdurumlardankaçınmakdeğildir,çünkü
sıradışıdurumlaraslındaokadardasıradışıdeğildir,işin
birparçasıdır:
Ø Kredikartıylaödemeyaparkenkartınlimitininyetmemesi,
Ø Birdosyayıaçmayaçalışırkenaçmayetkisinesahip
olunmadığınınortayaçıkması,
Ø Başvuruyaparkenbirbilginineksikolması
Ø gibidurumlar,aslensüreçlerintabiparçasıolanalternatif
hallerdir.
Ø Yanlışolan,işveihtiyaçanalizisırasındasüreçler
detaylandırılırkenbudurumlarınhiçdüşünülmemesidir.
www.javaturk.org
6
ca
de
m
y
SıraDışıDurumOlduğunda
Ø Önemliolansıradışıdurumoluştuğundayazılımınnasıl
devamedeceğidir.
Dosyabulunamadığındayenibirdosyaismisormakörneğin.
w
.s
Ø
el
so
f
t.a
Ø Yazılımlardasıradışıdurumoluştuğundatemeldeiki
seçeneksözkonusuolur:
Ø Durumukullanıcıyabildirmekveonunkararınagöredevam
etmek:
Ø Kararalıp,kullanıcıdanbirinisiyatifalmasınıbeklemedenve
Dosyabulunamadığındayenibirdosyaoluşturupdevametmek.
w
Ø
w
onahissettirmedençalışmayadevametmek.
www.javaturk.org
7
y
ca
de
m
SıraDışıDurumYönetimi
w
w
w
.s
el
so
f
t.a
Ø Sıradışıdurumyönetiminintemelkavramlarışunlardır:
Ø Sıradışıdurum(exception):Sıradışıdurumunkendisidir.
Durumileilgilibilgileridetaşır.
Ø Fırlatma (throw):SıradışıdurumuoluşturupJVM’e
bildirmektir.
Ø Yükseltme (raise):Sıradışıdurumubirüstbağlama
göndermektir.
Ø Yakalama (catch,handle):Fırlatılansıradışıdurumun,
yönetilmeküzereözelbirkodparçasınagirmesidir.
Ø Çağrızinciri(call chain):Metotlarınbirbirlerini
çağırmalarındandoğanzincirdir.
Ø Yığınizi(stack trace):Herhangibirandaaktifolanmetot
pencerelerinin(method frame)yığındakidurumudur.
www.javaturk.org
8
y
ca
de
m
SıraDışıDurumveHata
Ø Javaaçısındansıradışıdurum,hata (error)değildir.
w
w
w
.s
el
so
f
t.a
Ø Hatahangisebepleolursaolsun,geneldegeridönüşü
olmayanbirdurumdur.
Ø Yazılımlardafarklıtiptehatalarsözkonusudur:
Ø Derlemehataları:Sözdizimi(syntax)hatalarıdır.
Ø Çalışmazamanıhataları:Programınçalışmasısırasındaolan
hatalardır:JVM’deki birdurumdankaynaklananhata,“out of
memory”gibibellekhataları,vs.
Ø Mantıkhataları:Yazılımınsüreçlerindekihatalardırve“bug”
olarakadlandırılır.Buhatalartamamenyazılımtakımının
sorumluluğundadır.
www.javaturk.org
9
ca
de
m
y
MantıkHataları
w
.s
el
so
f
t.a
Ø Mantıkhatalarınınbirkısmıişmantığıylailgilidir:
Ø Satınalınanmalın,kupon,indirim,vergivs.densonrakifiyatını
yanlışhesaplamakbucinsten,“bug”deninceaklagelen
hatalardır.
Ø Bazımantıkhatalarıiseişmantığındanziyade,
programlamadiliyapılarıylailgilidir:
Ø null olanbirreferansınüzerindemetotçağrısıyapmak,
Ø n odayasahipbirdiziden. odayaulaşmayaçalışmak.
w
w
Ø Butürdenhatalar,doğrudanprogramcınınhatasıdırve
düzeltilmelidir.
www.javaturk.org
10
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Geleneksel Sıra Dışı Durum Yönetimi
www.javaturk.org
11
ca
de
m
y
GelenekselSıraDışıDurumYönetimi
so
f
t.a
Ø Hertüryazılımdasıradışıdurumlarsözkonusudurve
yönetilmelidir.
Ø Dillerdebutürdurumlariçinözelyapılarolmasabile
programatikolaraksıradışıdurumlartespitedilipyönetilir.
Ø Aşağıdakigibibir“readFile()” metoduolsun:
w
w
w
.s
el
// Pseudo code
readFile (fileName) {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
edit the file;
save the file;
close the file;
}
www.javaturk.org
12
ca
de
m
y
MuhtemelSıraDışıDurumlar
w
.s
el
so
f
t.a
Ø Verilenörnekteaşağıdakisıradışıdurumlarsözkonusu
olabilir:
Ø Dosyaaçılamazsa?
Ø Dosyanınboyutubelirlenemezse?
Ø Dosyayıaçmakiçinyeterincebellekyoksa?
Ø Dosyabelleğeokunurkenproblemçıkarsa?
Ø Dosyakapatılamazsa?
w
w
Ø Tümbu“readFile()” metodundaolabileceksıradışı
durumlardırvegelenekselşekildedeolsayönetilmelidir.
www.javaturk.org
13
ca
de
m
y
Ø Gelenekselsıradışıdurumyönetimi,int yadaStringhata
kodlarıüzerindenvegenelmekanizmalarlayapılır.
w
w
w
.s
el
so
f
t.a
// Pseudo code
errorCodeType readFile {
initialize errorCode = 0;
open the file;
if (fileIsOpen) {
determine the length of the file;
if (gotTheFileLength) {
allocate that much memory;
if (gotEnoughMemory) {
read the file into memory;
if (readFailed) { errorCode = -1; } // Can’t read
} else { errorCode = -2; } // Not enough memory
} else { errorCode = -3; }
// File length unavailable
close the file;
if (fileDidntClose && errorCode == 0){ errorCode = -4; }
else { errorCode = errorCode and -4; }
} else { errorCode = -5; } // File can’t open
return errorCode;
}
www.javaturk.org
14
ca
de
m
y
// Pseudo code
method1 {
errorCodeType error;
error = call method2;
if (error)
doErrorProcessing;
else proceed;
}
errorCodeType method2 {
errorCodeType error;
error = call method3;
if (error) return error;
else proceed;
}
w
w
w
.s
el
// Pseudo code
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
call readFile;
}
so
f
t.a
Ø “readFile()”metodunun
aşağıdakigibibirmetotzincirde
çağrıldığınıdüşünün.
Ø readFile() metodununfırlattığı
sıradışıdurumkodunun
method3() vemethod2()
üzerindenmethod1()’e
yükseltildiği durumdayandakigibi
birkodyapısısözkonusuolacaktır.
www.javaturk.org
errorCodeType method3 {
errorCodeType error;
error = call readFile;
if (error) return error;
else proceed;
}
15
ca
de
m
y
GelenekselYaklaşımınProblemleri
so
f
Ø
Sıradışıdurumunfarkedilmesi,oluşturulması,yığındakimetotlara
ulaştırılmasıveyakalanması,tamamendildekigenelyapılarla
halledilir.
Budurumprogramlarıdahakarmaşıkveanlaşılmazkılar.
el
Ø
t.a
Ø Gelenekselsıradışıdurumyönetimininenproblemliiki
özelliğişunlardır:
Ø Dildesıradışıdurumyönetimininmekanizmalarıyoktur,
yönetimtamamenprogramyazanlartarafındankurgulanır.
w
.s
Ø Sıradışıdurumlarancakint yadaString tipindedeğişkenlerle
ifadeedilirler.
w
Budaprosedürel yapılarınentemelproblemiolan“anlam”
probleminitekrargündemegetirir.
w
Ø
www.javaturk.org
16
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Java’da Sıra Dışı Durum Yönetimi
www.javaturk.org
17
ca
de
m
y
Java’daSıraDışıDurumYönetimi- I
so
f
t.a
Ø Java,nesne-merkezlibirdilolarak,
sıradışıdurumlarahaskontrolyapısı
vesıradışıdurumlariçin
oluşturduğunesnehiyerarşisiilesıra
dışıdurumyönetimisağlamaktadır.
w
w
w
.s
el
Ø Örnekolarakelealınan
“readFile()” metodununJava’nın
sıradışıdurumyönetimi
çerçevesindekavramsalolarakşöyle
olduğunudüşünülebilir:
// Pseudo code
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
call readFile;
}
www.javaturk.org
18
t.a
// Pseudo code
readFile {
try {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
}catch (fileOpenFailed){
doSomething;
}catch (sizeDeterminationFailed){
doSomething;
}catch (memoryAllocationFailed){
doSomething;
}catch (readFailed){
doSomething;
}catch (fileCloseFailed){
doSomething;
}
...
}
w
w
w
.s
el
so
f
Ø Java’dasıradışıdurum
yönetimiiçintry-catch
bloğukullanılır.
Ø Sıradışıdurum
fırlatmaihtimaliolan
kodtry bloğunda,
fırlatılabileceksıradışı
durumlarıyakalayacak
kodisecatch bloğuna
konur.
ca
de
m
y
Java’daSıraDışıDurumYönetimi- II
www.javaturk.org
19
// Pseudo code
readFile throws fileOpenFailed,
sizeDeterminationFailed,
memoryAllocationFailed,
readFailed,
fileCloseFailed {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
}
w
w
w
.s
el
so
f
t.a
Ø Yadasıradışıdurumu
yakalamayı-yönetmeyip,bir
üstbağlamayükseltmekde
sözkonusuolabilir.
Ø Budurumdatry-catch bloğu
kullanılmaz,oluşabileceksıra
dışıdurumlarmetodun
arayüzündelistelenirki,bu
metoduçağıranlaryakalamak
yadayükseltmektenbirini
seçebilsin.
Ø Bununiçinthrows anahtar
kelimesikullanılır.
ca
de
m
y
Java’daSıraDışıDurumYönetimi- III
www.javaturk.org
20
ca
de
m
y
Java’daSıraDışıDurumYönetimi- IV
// Pseudo code
method1 {
try {
call method2;
} catch (exception){
doExpProcessing;
}
}
w
w
w
.s
el
so
f
t.a
Ø Metotlarsıradışıdurum
fırlattıklarınıthrows ifadesiyle
belirtirler.
Ø readFile() metodunun
fırlattığısıradışıdurumun
method3() vemethod2()
üzerindenmethod1()’e
yükseltildiğidurumdayandaki
gibibirkodyapısısözkonusu
olacaktır.
Ø Budurumdasıradışıdurumu
yakalayanveyöneten
method1()’dir.
www.javaturk.org
method2 throws exception{
call method3;
}
method3 throws exception{
call readFile;
}
21
ca
de
m
y
Java’daSıraDışıDurumYönetimi- IV
// Pseudo code
method1 {
call method2;
}
w
w
w
.s
el
so
f
t.a
Ø Sıradışıdurumumethod1()
yerinemethod2() yakalarsakod
yandakigibiolur.
Ø Dolayısıylasoruşudur: Sıradışı
durumukimyakalar?
Ø Sıradışıdurumukimleryükseltir
(raise)?
Ø Sıradışıdurumuyakalayan,o
durumudüzeltmekiçinbilgiye
sahipolandır.
Ø Diğerleriisesıradışıdurumu,
yakalayanayükseltirler.
www.javaturk.org
method2 {
try {
call method3;
} catch (exception){
doExpProcessing;
}
}
method3 throws exception{
call readFile;
}
22
y
ca
de
m
t.a
w
w
w
.s
el
so
f
java.lang.Throwable Sınıfı ve Hiyerarşisi
www.javaturk.org
23
t.a
Ø Java’nınhatavesıradışı
durumlarlailgilinesneleri
yandakigibidir.
ca
de
m
y
Java’daHataveSıraDışıDurum
so
f
Ø Hatavesıradışıdurumların
atasıThrowable sınıfıdır.
w
w
w
.s
el
Ø Hatalar java.lang.Error
sınıfıyla,sıradışıdurumlarise
java.lang.Exception
sınıfıylaifadeedilir.
www.javaturk.org
24
ca
de
m
y
Throwable
Ø Java’datümhatalarvesıradışıdurumlar
java.lang.Throwable sınıfıylatemsiledilir.
t.a
Ø Throwable isimolarakbirarayüzgibigörünmesine
so
f
rağmenbirsınıftır.
w
.s
el
Ø İsterJVMtarafındanisterkodiçindeprogramatikolarak
fırlatılsın,Java’dafırlatılantümnesnelerbusınıfınyadaalt
sınıflarınınbirnesnesiolmakzorundadır.
w
w
Ø Throwable’ın sadeceikitanealtsınıfıvardır:Error ve
Exception
www.javaturk.org
25
y
ca
de
m
Throwable API- Kurucular
Ø Throwable sınıfının5tanekurucusuvardır.
so
f
Throwable()
t.a
Ø Ensıkkullanılan4kurucumetoduşunlardır:
el
Throwable(String message)
w
.s
Throwable(Throwable cause)
w
w
Throwable(String message, Throwable cause)
www.javaturk.org
26
y
ca
de
m
Throwable API:Metotlar
Ø Throwable nesnesiyakalanıncaüzerindemetotlar
yardımıylabazıbilgilereulaşılır:
t.a
String getMessage()
String getLocalizedMessage()
so
f
void initCause(Throwable t)
el
Throwable getCause()
w
.s
void printStackTrace()
w
void printStackTrace(PrintStream s)
w
void printStackTrace(PrintWriter s)
StackTraceElement[] getStackTrace()
www.javaturk.org
27
y
ca
de
m
StackTraceExample.java
Ø Örneğiönce“throwable.printStackTrace();”satırıolmadan
çalıştırın.
w
w
w
.s
el
so
f
t.a
Ø Sonra“throwable.printStackTrace();”satırıetkiniken
çalıştırınveyığınlaalakalıbilgiyialdığınıznoktadanitibaren
geriyedoğru,çalışmanınenbaşınakadar,oandayığında
olanmetotlarınnasılsıralandığınadikkatedin.
www.javaturk.org
28
y
ca
de
m
throw AnahtarKelimesi
Ø Throwable sınıfınınnesnelerifırlatılır.
so
f
t.a
Ø Buamaçlathrow anahtarkelimesikullanılır.
Ø throw anahtarkelimesi,Throwable sınıfınınyadaalt
sınıflarındanbirisininnesnesiniargümanolarakalır.
Yada
w
.s
el
Throwable throwable = new Throwable(“Just kidding!”);
throw throwable;
w
w
throw new Throwable(“Just kidding!”);
www.javaturk.org
29
ca
de
m
y
Throwable FırlatılıncaNeOlur?-I
so
f
Öylekibumetoduçağıranlar,budurumunolabileceğinden
haberdarolsunlar,
el
Ø
t.a
Ø Varolansıradışıdurumuthrow ileThrowable sınıfınınyada
altsınıflarındanbirisininnesnesinifırlatarakifadeedenkod
parçasıiçinşuikidurumdanbirisisözkonusudur:
Ø İçindebulunulanmetodunarayüzünde budurumunyanibir
Throwable nesnesininfırlatıldığınınbelirtilmesi,
Ø FırlatılanThrowable nesnesininyakalanıpgereğinin
w
.s
yapılması.
w
w
Ø Buikidurumdanilkine,yükseltme (raising yada
propogating),ikincisinedeyakalama (catching)denir.
www.javaturk.org
30
ca
de
m
y
Yükseltme(Raising-Propogating)- I
w
.s
el
so
f
t.a
Ø BirmetottafırlatılanThrowable nesnesinin,ometotta
yakalanmayıpbirüstbağlamayükseltilmesi(raising),
fırlatılannesneninmetodunarayüzünde throws anahtar
kelimesikullanarakifadeedilmesiyleolur.
Ø Birüstbağlam, Throwable nesnesinini fırlatanmetodu
çağıranveyığında(stack)biralttayadaçağrızincirinde(call
chain)birüsttebulunanmetottur.
w
w
public static void throwAThrowable() throws Throwable {
Throwable throwable = new Throwable("Just kidding!");
throw throwable;
}
www.javaturk.org
31
ca
de
m
y
Yükseltme(Raising-Propogating)- II
Ø Budurumdaüstbağlamdaaynıikiseçeneğesahiptir:
Yükseltmekveyayakalamak.
el
so
f
t.a
Ø Yanimetotlar,çağırdıklarımetotlarınkendilerineyükselttikleri
Throwable nesnesinibirüstbağlamayükseltebilirler.
Ø Yadayakalarlar.
w
w
.s
Ø EğerfırlatılanThrowable nesnesiniçağrızincirindekihiçbir
metotyakalamazsaJVMçalışmasınıdurdurur.
w
Ø DolayısıylafırlatılanThrowable nesnesimuhakkakyakalanmalıdır.
www.javaturk.org
32
y
ca
de
m
RaisingExample.java
Ø Programçalıştığındaekranabasılançıktıyadikkatedin.
t.a
Ø “After doSomething()”yazıldımı?
w
w
w
.s
el
so
f
Ø “throw throwable;”satırınıkaldırıptekrarçalıştırın,farkı
gözlemleyin.
www.javaturk.org
33
y
ca
de
m
Yakalama(Catching)
t.a
Ø throw ileThrowable sınıfınınyadaaltsınıflarından
birisininnesnesinifırlatankodparçasıiçinsözkonusuikinci
durum,fırlatılannesneyiyakalamaktır.
so
f
Ø Buamaçlatry - catch bloğukullanılır.
w
w
w
.s
el
private static void doSomething() {
try {
doSomethingElse();
} catch (Throwable e) {
System.out.println("Catching a Throwable");
}
}
www.javaturk.org
34
ca
de
m
y
try-catch Bloğu
Ø Throwable nesnesinifırlatankodparçası try blokunda
t.a
bulunur,fırlatılannesnenintipindeargümanasahipcatch
blokuisehemenardındangelir.
el
so
f
Ø Throwable sınıfınınaltsınıflarısözkonusuolduğunda
birdenfazlafarklıThrowable nesnesifırlatılabilir.
w
.s
Ø Budurumdabirdenfazlafarklıtiptenesneyiyakalamakiçin
birdenfazlacatch bloğualtaltabulunabilir.
w
w
Ø try ilecatch vebirdenfazlaolduğudurumdacatch blokları
arasınabaşkabirkodbloğugiremez.
www.javaturk.org
35
y
w
w
w
.s
el
so
f
t.a
ca
de
m
CatchingExample.java
www.javaturk.org
36
y
ca
de
m
t.a
w
w
w
.s
el
so
f
java.lang.Error Sınıfı
www.javaturk.org
37
ca
de
m
y
Error
Ø java.lang.Error sınıfı,uygulamalarınyakalayıp
so
f
t.a
düzeltmeyeçalışmayacağıciddihatalarıifadeeder.
Ø Biruygulamadahiçbirşekildebutiptenbirnesnenin
oluşmasınaizinverilmemelidir.
Ø AmaoluşanError nesneleriniyakalamaksözkonusu
değildir.
w
.s
el
Ø ÇünkübusınıfınnesneleriniJVMfırlatır.
w
w
Ø BirmetodunfırlattığıError nesnelerinithrows ifadesiyle
belirtmesigerekmediğigibibutiptennesnelerintry-catch
ileyakalanmasıdagerekmez.
www.javaturk.org
38
y
ca
de
m
w
w
w
.s
el
so
f
t.a
ErrorExample.java
www.javaturk.org
39
ca
de
m
y
JavaAPI’sindekiError Sınıfları- I
Ø Error sınıfları,herpaketteayrıbirbaşlıkaltındasıralanır.
t.a
Ø JavaAPI’sindeExceptionsınıflarındansonragelir.
Ø java.lang paketindekibazıError sınıflarışunlardır:
so
f
Ø AbstractMethodError: Soyutbirmetoduçağırmaya
w
w
w
.s
el
çalıştığınızdaoluşur.Normaldeçalışmazamanındayakalanır
amabazendahaöncesomutolanbirmetodusoyutyaparak
sınıfıtekrarderleyipkullanmayaçalışıldığındaoluşur.
Ø NoSuchFieldError veNoSuchMethodError
AbstractMethodError gibi,birsınıf,eskidurumlauygun
olmayanbirşekildedeğiştirilip,derlenipkullanıldığında
oluşur.
www.javaturk.org
40
ca
de
m
y
JavaAPI’sindekiError Sınıfları- II
Ø NoClassDefFoundError: Yükleneceksınıf
w
w
w
.s
el
so
f
t.a
bulunamadığındafırlatılır.
Ø VirtualMachineError: JVM’in çalışmasısırasında
oluşanhatalıdurumlariçinfırlatılır.
Ø StackOverflowError: Yığının(stack),yenibirmetot
çağrısıiçingereklibelleğesahipolmadığındafırlatılır.
Ø OutOfMemoryError: Heapin,yenibirnesneyaratmakiçin
gereklibelleğesahipolmadığındafırlatılır.
www.javaturk.org
41
y
ca
de
m
t.a
w
w
w
.s
el
so
f
java.lang.Exception Sınıfı
www.javaturk.org
42
ca
de
m
y
Exception
Ø java.lang.Exception sınıfı,yakalanmasıdüşünülenher
türlüsıradışıdurumutemsileder.
so
f
t.a
Ø UygulamalardaoluşansıradışıdurumlaryaException
sınıfınınyadaaltsınıflarınınnesnesiolarakfırlatılır.
el
Ø Exception nesneleriJVMtarafından,JavaAPI’sininbir
w
.s
parçasıolanmetotlardafırlatılabildiğigibiprogramatik
olarakdaoluşturulupfırlatılabilir.
w
Ø İkincihaldeExceptionsınıfınınaltsınıflarınınoluşturulmasıda
w
sözkonusudur.
www.javaturk.org
43
y
ca
de
m
ExceptionAPI:Kurucular
Ø Exception sınıfınınvarsayılandahil5tanekurucusu
el
so
f
t.a
vardır.
Ø Ensıkkullanılan,sıradışıdurumubetimleyenString
parametrealankurucudur.
Ø BazenbirException nesnesininyakalanıp,birbaşka
Exception nesnesinioluşturmaktakullandığıdagörülür.
w
.s
Exception(String message)
Exception(Throwable cause)
w
w
Exception(String message, Throwable cause)
www.javaturk.org
44
y
ca
de
m
ExceptionAPI:Metotlar
Ø Exception nesnesiyakalanıncaüzerindemetotlar
yardımıylabazıbilgilereulaşılır:
t.a
String getMessage()
so
f
String getLocalizedMessage()
el
Throwable getCause()
w
.s
void printStackTrace()
w
void printStackTrace(PrintStream s)
w
void printStackTrace(PrintWriter s)
www.javaturk.org
45
ca
de
m
y
JavaAPI’sindekiExceptionSınıfları- I
Ø Exceptionsınıfları,herpaketteayrıbirbaşlıkaltında,
sınıflardanveenumlardan sonrasıralanır.
t.a
Ø java.lang paketindekibazıException sınıflarışunlardır:
so
f
Ø java.lang.ClassCastException: Nesnelerinyanlış
w
w
w
.s
el
altsınıfadönüştürülmelerinde(down cast)fırlatılır.
Ø java.lang.IndexOutOfBoundsException: Stringya
dadizi(array)gibiyapılardayanlışerişimiifadeeder.
Ø java.lang.NumberFormatException: GirilenString
nesnesininsayıformatınadönüştürülmesisırasındaoluşan
sıradışıdurumlarıifadeeder.
www.javaturk.org
46
ca
de
m
y
JavaAPI’sindekiExceptionSınıfları- II
w
w
w
.s
el
so
f
t.a
Ø DiğerpaketlerdekibazısıkkullanılanException sınıfları:
Ø java.io.IOException: JVMiledışdünyaarasındaki
giriş-çıkışişlemlerisırasındaoluşansıradışıdurumlariçindir.
Ø java.sql.SqlException: JVMileveritabanıarasındaki
iletişimsırasındaoluşansıradışıdurumlariçindir.
www.javaturk.org
47
y
ca
de
m
ExceptionExample1.java
Ø Önce“openFile()”metodunuçalıştırın.
el
so
f
t.a
Ø Sonra“openFile()”metodunukaldırıp“openAndCloseFile()”
metodunuçalıştırın.
Ø “openAndCloseFile()”metodundaikitanecatch bloku
olduğunadikkatedin.
w
.s
Ø Sonradaikimetoduarkaarkayaçalıştırın.
w
w
Ø Geçerlivegeçersizgirdilerverereksıradışıdurumun
fırlatıldığıvefırlatılmadığıhallerigözlemleyin.
www.javaturk.org
48
y
ca
de
m
t.a
w
w
w
.s
el
so
f
try-catch ile Sıra Dışı Durum Yönetimi
www.javaturk.org
49
ca
de
m
y
try-catch BloğuveException- I
Ø Exception nesnesinifırlatankodparçasıtry blokunda
t.a
bulunur,fırlatılannesnenintipineuygunargümanasahip
catch bloğuisehemenardındangelir.
so
f
Ø Exception sınıfınınaltsınıflarısözkonusuolduğunda
birdenfazlafarklıException nesnesifırlatılabilir.
w
.s
el
Ø Budurumdabirdenfazlafarklıtiptenesneyiyakalamakiçin
birdenfazlacatch bloğualtaltabulunabilir.
w
w
Ø try ilecatch vebirdenfazlaolduğudurumdacatch blokları
arasınabaşkabirkodbloğugiremez.
www.javaturk.org
50
ca
de
m
y
try-catch BloğuveException- II
Ø Eğertry bloğuvarsaenazbirtanecatch bloğuolmalıdır.
so
f
t.a
Ø Eğerkodtry bloğunagirerse,sıradışıdurumoluşmazsaakış
catch bloğunagirmez,normalçalışmadevameder.
w
.s
el
Ø Eğerkodtry bloğunagirersevesıradışıdurumoluşursa,
akışvarolancatch bloklarındanbirtanesinedallanır.
w
w
Ø Dallanılan catch bloğu,fırlatılannesnenintipindenyada
uygunüstsınıfındannesneyiargümanolarakalmalıdır.
www.javaturk.org
51
ca
de
m
y
try-catch BloğuveException- III
t.a
Ø BirException nesnesiiçinsadecevesadecebircatch
bloğunadallanmaolabilir.
Ø catch bloğuargümanolarak Exception nesnesialanbir
metotgibidüşünülebilinir.
w
w
w
.s
el
so
f
try {
// Code that might generate exceptions
} catch(Type1 id1) {
// Handle exceptions of Type1
} catch(Type2 id2) {
// Handle exceptions of Type2
} catch(Type3 id3) {
// Handle exceptions of Type3
}
www.javaturk.org
52
y
ca
de
m
DivisionByZero1.java
Ø “divide()”metodunuönceikinciargümanı“0”olmayacak
şekilde,örneğin“divide(20,5)”çağırın.
w
w
w
.s
el
so
f
t.a
Ø Sonraikinciargümanı“0”olacakşekilde,örneğin
“divide(20,0)”çağırın.
Ø BudurumdafırlatılanArithmeticException nesnesini
yakalayacakşekildeörneğideğiştirin=>DivisionByZero2.java
www.javaturk.org
53
y
ca
de
m
DivisionByZero2.java
Ø DivisionByZero2,DivisionByZero1’insıradışıdurum
yönetiminiiçerenhalidir.
so
f
t.a
Ø “divide()”metodunuönceikinciargümanı“0”olmayacak
şekilde,örneğin“divide(20,5)”çağırın.
w
w
w
.s
el
Ø Sonraikinciargümanı“0”olacakşekilde,örneğin
“divide(20,0)”çağırın.
www.javaturk.org
54
ca
de
m
y
try-catch BloğuveException- III
el
so
f
t.a
Ø FırlatılanException nesnesineuyguntiptebircatch bloğu
bulunamazsa,bulununcayakadararamayadevamedilir.
Ø Bu,sıradışıdurumunmetotlararasında, yığındaenyukarıdan
enaşağıyadoğrugezdirilmesidir(propagating).
Ø Budurumdametodun,yakalanmasıgerekipdeyakalanmayan
nesneyi“throws”ifadesiilebelirtmesigereklidir.
w
w
w
.s
Ø Buaramada-gezdirmedeöncetry bloğunutakipedencatch
bloklarısorgulanır,uyguncatch bloğubulunamazsa,birüst
bağlamolançağıranmetodageçilirveaynıaramaoradada
yapılır.
www.javaturk.org
55
ca
de
m
y
try-catch BloğuveException- IV
so
f
t.a
Ø Eğerçağrızincirindekitümmetotlararandığıhaldefırlatılan
Exception nesnesineuygunbircatch bloğu
bulunamamışsabudurumdaJVMçalışmasınıdurdurur
(JVMcrashes and exits).
w
w
w
.s
el
Ø YaniJava’nınsıradışıdurumlarıyokgörülemez,muhakkak
yakalanmalıvegereğiyerinegetirilmelidir.
www.javaturk.org
56
y
ca
de
m
ExceptionExample2.java
w
w
w
.s
el
so
f
t.a
Ø “openAndCloseFile()”metodundafırlatılanikifarklı
Exception nesnesininikifarklıyerdeyakalandığınadikkat
edin.
www.javaturk.org
57
ca
de
m
y
try-catch BloğuveException- IV
so
f
t.a
Ø FırlatılanbirdenfazlaException nesnesiolduğunda
birdenfazlacatch bloğuolabileceğigibi,birmetotthrows
ilebirdenfazla Exception nesnesinifırlatacağını
belirtebilir.
Ø Budurumdafırlatılannesnenintipleri,throws anahtar
kelimesindensonravirgülilelistelenir.
private
static void openAndCloseFile(String path)
}
w
w
w
.s
el
throws IOException, FileNotFoundException {
File file = new File(path);
// throws FileNotFoundException
InputStream in = new FileInputStream(file);
System.out.println("File opened!");
in.close(); // throws IOException
System.out.println("File closed!");
www.javaturk.org
58
y
ca
de
m
ExceptionExample3.java
Ø “openAndCloseFile()”metodununnasılbirdenfazlasıradışı
durumfırlattığınıgözlemleyin.
w
w
w
.s
el
so
f
t.a
Ø Budurumda“openAndCloseFile()”metodununçağrıldığı
yerdebirdenfazlacatch bloğuolabilir.
www.javaturk.org
59
ca
de
m
y
try-catch BloğuveException- V
so
f
t.a
Ø “FırlatılanException nesnesineuyguntiptebircatch
bloğubulunamazsa,bulununcayakadararamayadevam
edilir.”dendi.
Ø “FırlatılanException nesnesineuyguntiptebircatch bloğu”
nedemektir?
w
w
w
.s
el
Ø JavaAPI’siiçerisindeException sınıfınınpekçokaltsınıfı
vardır.
Ø Yenilerinidesizoluşturabilirsiniz.
www.javaturk.org
60
y
ca
de
m
YerineGeçebilme- I
t.a
Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her
sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen
bağlamdakullanılabilir.
w
.s
Hersıradışıdurumnesnesi, üstsınıfındanbirnesnekabuleden
catch bloğutarafındanyakalanır.
w
w
Ø
el
so
f
Ø Bucümleninbirkaçfarklısonucuvardır,ilki:
1. Bircatch bloğu,aldığıException nesnesivetümalt
sınıflarınınnesneleriniyakalar.
www.javaturk.org
61
y
w
w
w
.s
el
so
f
t.a
Ø Yandakihiyerarşigözönüne
alındığında,
Ø fırlatılan
FileNotFoundExceptio
n nesnesi,IOException
hattaException nesnesi
bekleyencatch bloğunda,
Ø yadafırlatılan
ArithmeticException
nesnesi,
RuntimeException hatta
Exception nesnesi
bekleyencatch bloğunda
yakalanabilir.
ca
de
m
UygunException
www.javaturk.org
62
y
ca
de
m
DivisionByZero3.java
w
w
w
.s
el
so
f
t.a
Ø ArithmeticException fırlatan“divide()”metodunun
nesnesinin,nasılfarklıcatch bloklarıylayakalanabildiğini
gözlemleyin.
www.javaturk.org
63
y
ca
de
m
YerineGeçebilme- II
t.a
Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her
sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen
bağlamdakullanılabilir.
w
.s
Amadahaözelolanınıyadaaralarındabiris-ailişkisiolmayanı
fırlatamaz.
w
w
Ø
el
so
f
Ø Bucümleninikincisonucu:
2. Birmetot,gerçektefırlatılanException nesnesiyerine
dahadahagenelolanınıfırlatabilir.
www.javaturk.org
64
y
ca
de
m
ExceptionExample4.java
t.a
Ø Aynıkodasahipolan“openAndCloseFile()”metodunun
farklışekillerininnasılfarklıtürdensıradışıdurumnesneleri
fırlattığınıgözlemleyin.
w
w
w
.s
el
so
f
Ø Ama“openAndCloseFile()”metodunun,kodundafırlatılan
sıradışıdurumnesneleriilebiris-ailişkisinesahipolmayan
örneğinArithmeticException fırlatamayacağınıda
gözlemleyin.
www.javaturk.org
65
y
ca
de
m
YerineGeçebilme- III
w
w
Ø
Aksitaktirdeerişilemeyenkod(unreachable code)oluşurvebuda
birderlemezamanıhatasıdır.
catch bloklarımutlakafarklıtürdenException nesneleri
almalıdırlar,eğeraynıtry bloğununa aitikicatch bloğuaynınesneyi
alırsabirderlemehatasıoluşur.
w
.s
Ø
el
so
f
t.a
Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her
sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen
bağlamdakullanılabilir.
Ø Bucümleninüçüncüsonucu:
3. Birdenfazlacatch bloğununvarlığıhalinde,bubloklar,daha
özelException nesnesialanındandahagenelolanına
doğrusıralanmalıdır.
www.javaturk.org
66
y
ca
de
m
t.a
so
f
el
w
w
w
.s
try {
openAndCloseFile(path);
}
catch(IOException e){ … }
catch(FileNotFoundException e){
// unreachable code
}
try {
openAndCloseFile(path);
}
catch(Exception e){ … }
catch(IOException e){
// unreachable code
}
catch(FileNotFoundException e){
// unreachable code
}
www.javaturk.org
67
y
t.a
so
f
el
Ø Benzerbirdurum,
birmetodun
fırlattığısıradışı
nesneleri
tanıtırkensöz
konusudeğildir.
ca
de
m
YerineGeçebilme- III
w
// Ya da
w
.s
void openAndCloseFile(String path)
throws IOException, FileNotFoundException
w
void openAndCloseFile(String path)
throws FileNotFoundException, IOException
www.javaturk.org
68
y
w
w
w
.s
el
so
f
t.a
ca
de
m
ExceptionExample5.java
www.javaturk.org
69
ca
de
m
y
Human.java
w
w
w
.s
el
so
f
t.a
Ø B.Eckels’in “Thinking inJava”kitabından.
www.javaturk.org
70
ca
de
m
y
SıraDışıDurumYakalandıktanSonra
w
w
w
.s
el
so
f
t.a
Ø Sıradışıdurumyakalandıktansonraneolur?
Ø Akış,sıradışıdurumuyakalayancatch bloğundandevameder.
Ø Akış,sıradışıdurumasebepolanbağlamageridönmez.
Ø Dolayısıylasıradışıdurumuyakaladıktansonraşunlar
yapılabilir:
Ø Sıradışıdurumasebepolankodu,şartlarıdeğiştirerektekrar
çağırmak,
Ø Yadasıradışıdurumasebepolankodubirdahaçağırmadan
devametmek.
Ø Herhalükardasıradışıdurumulog ilekayıtaltınaalmakda
birseçenektir.
www.javaturk.org
71
y
ca
de
m
DivisionByZero4.java
Ø ArithmeticException nesnesiyakalandıktansonra
w
w
w
.s
el
so
f
t.a
akışınnasıldevamettiğinigözlemleyin.
www.javaturk.org
72
ca
de
m
y
catch BloğundaÇokluException- I
so
f
t.a
Ø Birdenfazlasıradışıdurumfırlatılmaihtimaliolması
durumunda,istenirsebirdenfazlacatch bloğuyazmak
yerinetekbircatch bloğuylayetinmekmümkündür.
Ø JavaSE7 ilegelenbuözelliksayesindecatch bloğuna“|”ile
yakalanacakbirdenfazlaException nesnesinintipi
geçilebilir.
w
.s
el
try {…}
catch(IOException e){…}
catch(ArithmeticException e){…}
w
w
try {…}
catch(IOException | ArithmeticException e){…}
www.javaturk.org
73
y
w
w
w
.s
el
so
f
t.a
ca
de
m
DivisionByZero5.java
www.javaturk.org
74
ca
de
m
y
catch BloğundaÇokluException- II
w
.s
el
so
f
t.a
Ø catch bloğundaçokluException kullanılmasıdurumunda,
hertürnesneiçinaynıkodungeçerliolduğunadikkat
edilmelidir.
Ø Ayrıcacatch bloğunageçilenException nesneleri
arasındabiris-ailişkisiolmasıdurumunda,sadecedaha
genişolantipkullanılabilir.
Ø Budurumzatenbirderlemehatasıdır.
w
w
try {…}
catch(IOException | FileNotFoundException e){…}
// Compilation error
www.javaturk.org
75
y
ca
de
m
t.a
w
w
w
.s
el
so
f
try-catch ile Kaynak Yönetimi
www.javaturk.org
76
ca
de
m
y
try-catch BloğuveKaynaklar
t.a
Ø Sıradışıdurumlarıtry-catch ileyönetimindeeğertry
bloğundabazıkaynaklaraçılıyorsavetry bloğundasıradışı
durumfırlatılırsabukaynaklarkapanmayabilir.
w
w
w
.s
el
so
f
private static void openFile(String path) {
File file = new File(path);
try {
InputStream in = new FileInputStream(file);
System.out.println("File opened!");
doSomethingWithFile(in);
in.close(); // Can’t get here to close file
} catch (FileNotFoundException e) { … }
catch (IOException e) { … }
}
www.javaturk.org
77
y
ca
de
m
Kaynaklıtry Bloğu
so
f
t.a
Ø Butürdenaçılankaynaklarınkapanmamariskiniortadan
kaldırmakiçinJavaSE7’dekaynaklı try bloğu (try-withresources)yapısıgeldi.
Ø Buyapıyla,try ifadesinde,bloktakullanılacakveneşekilde
olursaolsunblokçıkışındaotomatikolarakkapatılacak
kaynaklartry ifadesindelistelenir.
w
w
w
.s
el
try (ResType1 res1 = initialization1,
ResType2 res2 = initialization2,…){
doSomething();
}
catch(SomeException e){ … }
catch(OtherException e){ … }
catch(AnotherException e){ … }
www.javaturk.org
78
ca
de
m
y
AutoClosable
so
f
t.a
Ø Birkaynağın,kaynaklıtry bloğundalistelenebilmesiiçin
java.io.AutoClosable arayüzünügerçekleştirmesiya
dabuarayüzügerçekleştirenbirsınıftanmirasdevralması
gereklidir.
el
Ø AutoClosable arayüzünde birtanemetotvardır.
w
.s
public void close()
w
w
Ø Bumetot,try bloğundatanımlanankaynakların,try
bloğundanneşekildeçıkılırsaçıkılsınkapatılmasıiçin
otomatikolarakçağrılır.
www.javaturk.org
79
y
ca
de
m
ClosableExample.java
Ø Önce“run0()”metodunuçalıştırınvekaynaklıtry
kullanılmadığıhaliinceleyin.
w
w
w
.s
el
so
f
t.a
Ø Sonra“run1()”metodunuçalıştırınveaynıişinkaynaklıtry
ilenasıldahakolayyapılabildiğinigözlemleyin.
www.javaturk.org
80
y
ca
de
m
KaynaklarıKapatma
Ø try ifadesindebirdenfazlakaynaktanımlanırsa,
kapatılmalarıtanımsırasınıntersineolur.
so
f
t.a
Ø Dolayısıylailktanımlananensonkapanır.
w
w
w
.s
el
Ø Birbirlerinebağımlıyapılardabudurumugözönünealmak
gereklidir.
www.javaturk.org
81
ca
de
m
y
KaynağıOluştururkenProblem
w
w
w
.s
el
so
f
t.a
Ø Eğerkaynakaçılırkenyaninesnesioluşturulurkenproblem
olursavebirsıradışıdurumfırlatılırsabudurumdazaten
kaynakoluşturulmayacakdemektir.
www.javaturk.org
82
y
ca
de
m
ClosableExample.java
Ø “run2()”metodunuçalıştırın.Buradakaynaklarınhangi
sıralayla kapanacağınıgözlemleyin.
w
w
w
.s
el
so
f
t.a
Ø “run3()”metodunuçalıştırın.Buradakaynakların
oluşturulurkenbirsıradışıdurumfırlatılmasıhalindene
olacağınıgözlemleyin.
www.javaturk.org
83
y
ca
de
m
t.a
w
w
w
.s
el
so
f
finally
www.javaturk.org
84
ca
de
m
y
finally Bloğu- I
so
f
t.a
Ø finally, try-catch yapısındakullanılabilenbirdiğerbloktur.
Ø Zorunlıdeğildir,olursasadecebirtaneolabilir.
Ø Muhakkakensoncatch bloğundansonragelir.
Ø try-catch-finally bloklarıarasınabirbaşkakodparçasıgiremez.
Ø try bloğunagirenkod, catch bloğunagirsinyadagirmesin,
daima finally bloğunagirer.
w
w
w
.s
el
try {
doSomething;
}
catch(SomeException e){ … }
catch(OtherException e){ … }
catch(AnotherException e){ … }
finally{ … }
www.javaturk.org
85
ca
de
m
y
finally Bloğu- II
t.a
Ø Dolayısıylafinally bloğu,sıradışıdurumoluşmasınabağlı
olmadan,try bloğunagirmektenkaynaklanandurumlariçin
kullanılır.
w
w
w
.s
el
so
f
Ø Akıştry bloğunagirildiktensonraisternormalolarakçıksın
isterbirsıradışıdurumunfırlatılmasıylaçıksın,nihayetinde
muhakkakfinally bloğunagirer.
www.javaturk.org
86
y
w
w
w
.s
el
so
f
t.a
ca
de
m
FinallyExample.java
www.javaturk.org
87
y
ca
de
m
finally Bloğu– Kaynaklıtry
Ø finally bloğununkaynaklarıotomatikolarakkapatan
kaynaklıtry bloğundanfarkınedir?
so
f
t.a
Ø Kaynaklıtry bloğusadeceAutoClosable olanyapılariçin
geçerlidir.
w
w
w
.s
el
Ø Bunundışındakihertürlükaynağınyönetimiiçinfinally
bloğukullanılmalıdır.
www.javaturk.org
88
y
ca
de
m
Nedenfinally Bloğu?
w
w
w
.s
el
so
f
t.a
Ø finally bloğukaynakyönetimiaçısındanönemlidir.
Ø Öncelikle AutoClosable olankaynaklariçinkaynaklıtry
kullanılmalıdır.
Ø try içindeaçılanveAutoClosable olmayanvehertürlü
kaynağıkapatmanınyerifinally bloğudur
Ø Dolayısıylafinally bloğu,try bloğundayapılanhertürlüişiçin
birtemizlikyeriolarakdüşünülmelidir.
Ø Buşekildesıradışıdurumfırlatılmasabileözelliklereturn,
break vecontinue gibikontrolyapılarıyüzündençalışmayan
vetemizlikyapankodparçalarınınfinally bloğunda
çalışmasısağlanır.
www.javaturk.org
89
y
w
w
w
.s
el
so
f
t.a
ca
de
m
CleanUpWithFinally.java
www.javaturk.org
90
ca
de
m
y
Dikkat!
Ø finally bloğundakaynaklarıkapatırkensıradışıdurumların
tekraroluşabileceğidedüşünülmelidir.
w
w
w
.s
el
so
f
t.a
Ø Dolayısıylafinally bloğundadatry-catch-finally kullanılabilir.
www.javaturk.org
91
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Sıra Dışı Durumu Tekrar Fırlatmak
www.javaturk.org
92
y
ca
de
m
TekrarFırlatmak- I
Ø Bazensıradışıdurumyakalanıramatekrarfırlatılır.
Ø Budurumlardayakalamaamacıçoğunluklaloglamaktır.
w
.s
el
so
f
t.a
try {
// access the database
} catch (SQLException ex) {
...
logger.log(logLevel, message, ex);
throw ex;
}
w
w
Ø Amasıradışıdurumunnasılyönetileceğibilinmediğinden,
gerçektenonuyönetecekkodagitmesiiçinsıradışıdurum
tekrarfırlatılır.
www.javaturk.org
93
y
ca
de
m
TekrarFırlatmak- II
so
f
t.a
Ø Bazendesıradışıdurumyakalanıp,birbaşkasıradışı
durumuniçinekoyuptekrarfırlatılır.
Ø Budurumasıradışıdurumlarızincirleme(chaining
exceptions)denir.
Ø Buamaçla void initCause(Throwable t) metodu
kullanılabilir.
w
w
w
.s
el
try {
// access the database
} catch (SQLException ex) {
logger.log(logLevel, message, ex);
Throwable e = new NoSuchProductException(“No such product!”);
e.initCause(ex); // Optional!
throw e;
}
www.javaturk.org
94
y
ca
de
m
TekrarFırlatmak- III
w
.s
el
so
f
t.a
Ø Bazenbirsıradışıdurumyakalanıptamamenfarklıbirsıra
dışıdurumunfırlatıldığıdaolur.
Ø Buamaçla void initCause(Throwable t) metodu
çağrılmazyadakurucumetodayakalanansıradışıdurum
geçilmez.
Ø Buyaklaşım,çokteknikolansıradışıdurumların
yakalanmasındakullanılır.
Ø Tekniksıradışıdurumbuyolladahaişmerkezlisıradışı
durumadöndürülmüşolur.
w
w
try {
// access the database
} catch (SQLException ex) {
logger.log(logLevel, message, ex);
Throwable e = new NoSuchProductException(“No such product!”);
throw e;
}
www.javaturk.org
95
y
ca
de
m
TekrarFırlatmak- IV
Ø Bununengüzelörneği,java.sql.SQLException gibibazı
sıradışıdurumnesnelerinin,tekbirnesneileolabilecekpekçok
sıradışıdurumutemsiletmesidir.
so
f
t.a
Ø Böyledurumlardabusıradışıdurumyakalanırveiçindeki
bilgilerdenyolaçıkarakfarklıişsıradışıdurumlarıfırlatılabilir.
getErrorCode()
el
int
w
.s
SQLException
getNextException()
getSQLState()
Iterator<Throwable>
iterator()
w
w
String
www.javaturk.org
96
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Checked-Unchecked Exceptions
www.javaturk.org
97
y
ca
de
m
Checked veUnchecked
w
w
w
.s
el
so
f
t.a
Ø Java’dasıradışıdurumlarikiye
ayrılır:checked veunchecked.
Ø Exception sınıfınınaltsınıfı
olupdaRuntimeException
olmayansınıflar,checked
exception olarakadlandırılırlar.
Ø RuntimeException vealt
sınıflarıiseunchecked
exceptiondur.
Ø Error deunchecked
exceptiondur.
www.javaturk.org
98
y
ca
de
m
Checked Exceptions
so
f
t.a
Ø Checked exceptionlar yayakalanmalıyadametot
arayüzünde throws ilefırlatıldığıbelirtilmelidir.
Ø Dahaöncegeçen“Java’nınsıradışıdurumlarıyok
görülemez,muhakkakyakalanmalı...”cümlesisadece
checked exceptionlar içingeçerlidir.
w
w
w
.s
el
Ø Eğerbirkodparçasıchecked exception fırlatıyorsabu
durumdaikiseçenekvardır:
Ø Yatry-catch ileyakalamak,
Ø Yadayakalamayıparayüzde throws ilefırlatıldığınıbelirtmek.
Ø Budurumderlemezamanındakontroledilirvegerekirse
derlemehatasıverilir.
www.javaturk.org
99
y
ca
de
m
Unchecked Exceptions - I
so
f
t.a
Ø Unchecked exceptionlar yakalanmakyadametot
arayüzünde throws ilefırlatıldığıbelirtilmekzorunda
değildir.
Ø Çünküunchecked exceptionlar programcıhatasıdır,
düzeltilmelidirler.
w
w
w
.s
el
Ø Tümunchecked exceptionlar
lava.lang.RuntimeException sınıfınınyadaalt
sınıflarınınnesneleridir.
Ø RuntimeException sınıfının(yadaaltsınıflarının)
nesnelerininfırlatılmasıderlemezamanındakontrol
edilmezveyakalanmadığıyadabelirtilmediğindedehata
oluşmaz.
www.javaturk.org
100
y
ca
de
m
Unchecked Exceptions - II
Ø RuntimeException sınıfının(yadaaltsınıflarının)
t.a
nesnelerininfırlatılmasıderlemezamanındakontrol
edilmezveyakalanmadığıyadabelirtilmediğindedehata
oluşmaz.
el
so
f
Ø Buyüzdenbutürsıradışıdurumlarınatasıolansınıfa
RuntimeException adıverilmiştir.
w
w
w
.s
Ø Aslenchecked olsunyadaolmasıntümsıradışıdurumlar
zatençalışmazamanındaoluşur.
www.javaturk.org
101
y
ca
de
m
Checked - Unchecked
so
f
t.a
Ø Checked exceptionlar umulanvedüzeltilebilecekdurumları
ifadeeder,örneğinFileNotFoundException.
Ø Buyüzdençalışmazamanındayakalanıpdüzeltilmelidirler.
Ø Amaunchecked exceptionlar programcıhatasıdır,çalışma
zamanındaoluşmasıbeklenmemelidir.
Ø ÖrneğinNullPointerException
w
w
w
.s
el
Ø Eğerbirunchecked exception çalışmazamanında
oluşuyorsa,koddadüzeltilmelidirler.
Ø Nihayetindebiryazılımsistemininkodu,çalışmazamanında
hiçbirunchecked exception fırlatmayacakhale
getirilmelidir.
www.javaturk.org
102
ca
de
m
y
YaygınUnchecked Exceptionlar
Ø Yaygınunchecked exceptionlar:
Ø java.lang.NullPointerException:Muhtemelenenyaygın
w
w
w
.s
el
so
f
t.a
unchecked exceptiondur.null referansıifadeeder.
Ø java.lang.ArithmeticException:Matematiksel
hesaplamalardaortayaçıkabilecekdurumlardır.“0”abölmek
gibi.
Ø java.lang.ClassCastException:Nesnelerinyanlışaltsınıfa
dönüştürülmelerinde(down cast)fırlatılır.
Ø java.lang.IndexOutOfBoundsException:Stringyadadizi
(array)gibiyapılardayanlışerişimdurumlarınıifadeeder.
Ø java.lang.NumberFormatException:GirilenString
nesnesininsayıformatınadönüştürülmesisırasındaoluşan
sıradışıdurumlarıifadeeder.
IllegalArgumentException’un altsınıfıdır.
www.javaturk.org
103
w
w
w
.s
el
so
f
t.a
ca
de
m
y
RuntimeExceptionExample.java
www.javaturk.org
104
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Sıra Dışı Durum Sınıfı Oluşturmak
www.javaturk.org
105
ca
de
m
y
SıraDışıDurumSınıfıOluşturmak- I
w
w
w
.s
el
so
f
t.a
Ø Kodunuzdakisıradışıdurumlarıyönetmekiçinönce
Java’nınvekullandığınızdiğerbileşenlerinyada
kütüphanelerinsıradışıdurumlarınıkullanın.
Ø ÖrneğinHibernate’in Session sınıfındakiload() metodu
veritabanındagirilenbiridye karşılıknesnebulunamadığında
org.hibernate.ObjectNotFoundException sıra
dışıdurumufırlatılırvemesajolarakda“Norow with the
given identifier exists”yazar.
Ø Budurumdabusıradışıdurumyakalanıpişlenebileceğigibi,
yakalanannesnedenalınacakbilgilerle
“BoyleBirUrunBulunamadı” yada“NoSuchProduct” gibisıra
dışıdurumlarfırlatılabilir.
www.javaturk.org
106
ca
de
m
y
SıraDışıDurumSınıfıOluşturmak- II
so
f
t.a
Ø Bunlaryeterlideğilsekendisıradışıdurumsınıflarınızı
oluşturun.
Ø SıradışıdurumsınıfıoluşturmakiçinException sınıfından
mirasdevralınır.
argümangeçilir.
el
Ø TipikolarakkurucusunaString
w
w
w
.s
Ø İhtiyacagöresınıfüzerindefarklıdeğişkenlervegerekli
set/get metotlarıdaoluşturulabilir.
Ø Çünküsıradışıdurumnesneleribilgitaşıyabilir.
www.javaturk.org
107
w
w
w
.s
el
so
f
t.a
ca
de
m
y
ShapeTest.java
www.javaturk.org
108
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Exception ve Overriding
www.javaturk.org
109
ca
de
m
y
Ezilen Metotların Sıradışı Durumları
w
w
w
.s
el
so
f
t.a
Ø Üst tipteki bir metodun fırlatığı sıra dışı durumlar ile bu
metodun devralınıp,overrideedildiği durumdaki fırlattığı
sıra dışı durumlar arasındaki ilişki nedir?
Ø Üst tipteki metot overrideedildiğinde,overrideeden
metot,ebeveyndeki metodun fırlattığı sıra dışı durumlardan
fazlasını fırlatamaz ama daha azını fırlatabilir.
Ø Çünkü,ebeveynin istemcisi ençok ebeveyndeki metodun
fırlattığı sıra dışı durumu beklemektedir,daha çoğunu
beklememektedir.
Ø Alttipte,ebeveyndeki metodun fırlattığından daha çoğunu
fırlatmak,yerine geçme özelliğini bozar.
www.javaturk.org
110
ca
de
m
y
Ezilen Metotların Sıradışı Durumları
w
w
w
.s
el
so
f
t.a
Ø Dolayısıyla overrideeden metot şu üç durumdan birini
seçebilir:
Ø Aynı sıra dışı durumu fırlatmak,
Ø Ebeveynde fırlatılan sıra dışı durumun bir alttipini fırlatmak,
Ø Hiç sıra dışı durumfırlatmamak.
www.javaturk.org
111
ca
de
m
y
HR.java &HRForManagerX.java
w
w
w
.s
el
so
f
t.a
Ø overriding package
www.javaturk.org
112
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Assertion
www.javaturk.org
113
y
ca
de
m
DefensiveProgramming
t.a
Ø http://c2.com/cgi/wiki?DefensiveProgramming de:
“Defensiveprogrammingdefendsagainstthecurrently
impossible”.
w
w
w
.s
el
so
f
Ø Savunmacı programlama,olabilecek durumları önceden
sezerek onlara karşı önlem almayı öngören bir
programlama yaklaşımıdır.
www.javaturk.org
114
ca
de
m
y
Assertion
Ø Assertionkelime olarak öne sürme,iddia etme gibi
anlamlara gelir.
ise savunmacı programlamanın (defensive
programming)bir tekniğidir.
so
f
t.a
Ø Programlamada
el
Ø Assertion,bir boolean değer üreten ve herzamantrue
Aksi taktirde hata (error) oluşur.
w
w
Ø
w
.s
beklenen durumdur.
olması
www.javaturk.org
115
y
ca
de
m
assertAnahtar Kelimesi - I
Ø assert anahtar kelimesi Java’ya 1.5sürümüyle birlikte
katılmıştır.
Ø assert kullanımının iki şekli vardır:
assert expression;
so
f
için kullanılır.
t.a
Ø İlkinde assert kendisini takip eden ifadenin doğruluğunu testetmek
Ø İfade doğruysa çalışma devam eder,yanlışsa
w
.s
el
java.lang.AssertionError fırlatılır.
Ø İkinci şekilde ise assert’ten sonra iki ifade vardır:
assert expression1 : expression2;
w
Çalışma ilkşekildeki gibidir.Tek fark ilkifadenin yanlış olması
halinde bir değer üreten ikinci ifadenin sonucunun
AssertionError’in uygun bir kurucusuna geçilmesidir.
w
Ø
www.javaturk.org
116
y
ca
de
m
assertAnahtar Kelimesi - II
t.a
Ø assert kullanımı,maliyetli oluşundan dolayı çalışma zamanı
için açılıp kapatılabilen bir özelliktir.
el
so
f
Ø Varsayılan durumda assert kullanımı kapalıdır.
Ø Açmak için JVM’e –enableassertions ya da–ea seçeneklerini
geçmek gereklidir,aksi taktirde assert ifadeleri çalışmaz.
w
w
w
.s
Ø Buyüzden assert ifadeleri kod geliştirme aşamasında,
kodun doğru çalıştığından emin olmak için kullanılır ve canlı
(live)ortamda kapatılır.
www.javaturk.org
117
y
w
w
w
.s
el
so
f
t.a
ca
de
m
AssertionExample.java
www.javaturk.org
118
ca
de
m
y
TestAmaçlı assertKullanımı - I
t.a
Ø assert kullanımının açılır-kapatılır bir özellik olması,bu
yapının programcı tarafından testamacıyla serbestçe
kullanılabilmesine imkan tanır.
w
w
w
.s
el
so
f
Ø Buyüzden assert genel olarak bir verinin geçerliliğini
(invariant)testetmek için kullanılır.
Ø Buveri bir metottaki yerel değişken olabileceği gibi bir
nesnenin durumu daolabilir.
Ø Ön ve sonşartları (pre&postconditions)testetmek için de
kullanılır.
www.javaturk.org
119
y
ca
de
m
w
w
w
.s
el
so
f
t.a
SqrtCalculator.java
www.javaturk.org
120
w
w
w
.s
el
so
f
t.a
ca
de
m
y
PrePostConditionsExample.java
www.javaturk.org
121
w
w
w
.s
el
so
f
t.a
ca
de
m
y
SwitchDemoWithAssertion.java
www.javaturk.org
122
ca
de
m
y
assertve Sıra Dışı Durumlar
w
.s
el
so
f
t.a
Ø assert kullanımının açılır-kapatılırdır ama sıra dışı durum
yönetimi kalıcıdır.
Ø Dolayısıyla assert canlı ortamda olması muhtemel
durumları yakalamak için kullanılmaz.
Ø Zaten sıra dışı durumoluşunca yakalanır ve çalışma devam
eder.
Ø Ama AssertionError oluşunca JVMçalışmasını durdurur.
w
w
Ø assert kodun doğru çalıştığından emin olmak amacıyla,bir
geliştirme zamanı yapısı olarak,bir durumun olmadığını test
etmek için kullanılır ve canlı ortamda kapatılır.
www.javaturk.org
123
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Sıra Dışı Durum İçin Tavsiyeler
www.javaturk.org
124
ca
de
m
y
Tavsiyeler - I
Ø Sıra dışı durumları iş modelinizin parçası haline getirin.
Ø Buamaçla kendi Exception nesnelerinizi oluşturun.
Ø Exception nesnelerini kullanırken olabildiğince özel olun,
t.a
genel olmayın.
so
f
Ø Örneğin Exception nesnesini hiç bir zamanfırlatmayın,
daimadahaözelaltnesnelerinifırlatın.
w
w
w
.s
el
Ø Fırlattığınız sıra dışı durumnesnelerine gerekli detayda
veriyi koyun.
Ø Fırlatılan sıra dışı durumları API’de @throws ile belirtin ve
açıklayın.
www.javaturk.org
125
ca
de
m
y
Tavsiyeler - II
w
w
w
.s
el
so
f
t.a
Ø Ya kaynaklı try kullanın ya dafinally bloğunda kaynaklarınızı
kapatın.
Ø Sıra dışı durumları loglayın.
Ø Buamaçlabirloglamayapısıkurgulayın.
www.javaturk.org
126
ca
de
m
y
Özet
Ø Bubölümdesıradışıdurumyönetimielealındı.
t.a
Ø Throwable, Error veException sınıflarıincelendi.
el
so
f
Ø try-catch-finally yapısıelealındı.
w
w
.s
Ø assert anahtarkelimesivesavunmacıprogramlamaele
alındı.
w
Ø Sıradışıdurumyönetimiyleilgilitavsiyelerelealındı.
www.selsoft.academy
127
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Ödevler
www.selsoft.academy
128
ca
de
m
y
Ödevler I
so
f
t.a
Ø Employee hiyerarşisininbulunduğuörnekte,maaşı7.000TL
veüzerineolanlariçinSalaryPaidOnBankException
isimlibirsıradışıdurumnesnesioluşturupörneğitekrar
düzenleyin.
w
w
w
.s
el
Ø BazıJavaframeworkleri checked exception kullanmayıp,
tümexceptionları RuntimeException yaniunchecked
exception olaraktanımlamaktadır.Butercihitartışın.
www.selsoft.academy
129
Download