jcf: java collections frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · program hatalarini...
TRANSCRIPT
Kısım I
Exceptions (istisnalar)
1 Program Hatalarını Ayıklama
(Exceptions handling)
1.1: Hata
1.2: Hata
Programlamanın altın bir kuralı vardır. Program ya dogru sonuçlar
vermeli ya da hiç çalısmamalı. Çünkü yanlıs sonuçlar, ciddi sorunlar
yaratabilir. Program hatalarını üç gruba ayırabiliriz.
1.1.0.1 Sözdizimi yanlısları (syntax errors)
Bunlar programcının canını sıkabilirler, ama baskalarına zarar ve-
remezler, çünkü derlenemezler, kosturulamazlar. Dolayısıyla yanlıs
sonuç vermeleri olanaksızdır. Bu gruptakiler tehlikesiz yanlıslardır.
2.1.0.2 Mantıksal yanlıslar (logical errors)
Kaynak programın sözdizimi dogrudur, derlenebilir, kosturulabilir.
Ama yapılmak istenen isler için kullanılan bazı deyimler ya da formül-
ler yanlıstır. Yanlıs islemler, yanlıs hesaplar yapar. Programın denenme
asamasında bu tür yanlıslar ortaya çıkmazsa, programın kullanılması
ciddi sorunlar yaratabilir. Örnegin, bir bankada faiz hesabı yapan bir
program modülünde faiz oranının yanlıs girildigini düsününüz. Kısa
zamanda, üstesinden gelinmesi zor sorunlar yaratır. Bu tür yanlıslar,
programcılıkta en tehlikeli sayılan yanlıslardır.
3.1.0.3 Kosma-anı-hataları (Runtime errors)
Program sözdizimi ya da mantıksal yanlıs içermiyor, ama bazı neden-
lerle kosamıyor olabilir. Örnegin, gerekli verileri bir giris biriminden
okuyamaması, ya da verileri bir çıkıs birimine gönderememesi, islem-
lerde sıfıra bölme gibi olanaksız bir durumla karsılasması vb.
Biz bu bölümde, üçüncü tür yanlıslarla, yani kosma sırasında olusan
yanlıslarla ilgilenecegiz. Teknik ifadesiyle söylersek, program yazılırken
bilinemeyecek, ama program kosarken olusabilecek istisnai (exceptions)
durumları konu edinecegiz. Kosma sırasında beklenmedik bir hata ile
karsılastıgında, kaynak program baska bir önlem koymamıssa, sistem
program akısını durdurur. Bu durum bazen zararlı sonuçlar da yaratabilir.
Örnegin, bir I/O isleminde, gerekli veri dönüsümünün bir nedenle yapı-
lamaması istisnai bir haldir ve bu noktadan sonra programın kosması
aniden durmak zorundadır. Ama, programın kosması durunca, veri alıs-
verisi yaptıgı dosyaları kapatamaz. Böylece o dosyalarda veri kaybına yol
açabilir.
4 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
Programlamanın ilk yıllarında, bu tür yanlısların üstesinden gele-
bilmek için hayli zorluk çekilirdi. Java, kosma sırasında olusan bir çok
yanlısı kendiliginden belirler, durumu kullanıcıya bildirir ve programı
kapatıp isletim sistemine döner. Buna ek olarak, bu tür yanlıslar olustu-
gunda, programcı ne yapmak istiyorsa, onu yapmasını saglayan araçlara
da sahiptir. Bu bölümde, o araçların nasıl kullanıldıgını görecegiz.
Java nesne yönelimli bir programlama dili olduguna göre, istisnai
durumları bir sınıf olarak düsünmüs olması dogaldır. Java.lang paketi
içinde Throwable sınıfı bu is için yaratılmıstır. Throwable sınıfı, karsıla-
sılabilecek bütün istisnai durumları ortaya koyabilecek çok sayıda alt
sınıflara ve metotlara sahiptir.
1.1 Hata yakalanmazsa
Program kosarken olusabilecek hataları yakalamanın ne kadar önemli
oldugunu anlamak için asagıdaki basit örnekleri verelim.
Program 1.1.1.
1 pub l i c c lass Örnek {pub l i c s t a t i c void main( Str ing [ ] args ) {
Object [ ] s = new Integer [ 4 ] ;s [ 1 ] = 4 . 4 ;
}6
}
/* *Ecl ips ç ı kt ı s ı :
3 Exception in thread "main" java . lang . Error : Unresolved compilation problem :
at hata .Örnek . main( I l l e g a l A c c e s s . java : 4 ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BlueJ ç ı kt ı s ı :8 * java . lang . ArrayStoreExeption : Double
* at Örnek . main(Örnek . java : 6) s [ 0 ] = 4 . 4 ;
*/
Açıklama:
Bu programın sözdizimi (syntax) dogrudur. Dolayısıyla hatasız der-
lenir. Program Integer tipinden 4 bilesenli bir array yaratıyor. Derleme
anında herhangi bir sorun dogmuyor. Ama kosma anında, 4.satırda
array’in ilkinci bilesen degeri olarak double 4.4 degerini koymaya çalıs-
maktadır. Yaratılan Integer array’inin bilesenlerine Double tipten nesne
atayamadıgı için Runtime hatası olusuyor.
Görüldügü gibi BlueJ çıktısı olusan hata hakkında eclips’ten daha çok
bilgi vermektedir.
Program 1.1.2 önceki programa exception yönetimi için try-catch
bloklarını koymaktadır. Böylece program akısı 4.satırda kesilmeden
devam etmektedir.
Program 1.1.2.
package hata ;
pub l i c c lass ArrayStore {pub l i c s t a t i c void main( Str ing [ ] args ) {
5 t r y {Object [ ] s = new Integer [ 4 ] ;s [ 1 ] = 4 . 4 ;
} catch ( ArrayStoreException e ) {System . out . print ln ( " Integer t i p girmediniz " ) ;
P RO G R A M H ATA L A R I N I AY I K L A M A 5
10 }System . out . print ln ( "Program ak ı s ı devam ediyor " ) ;
}}
/* *2 Integer t i p girmediniz
Program ak ı s ı devam ediyor
*/
Açıklama:
try blokuna Program 1.1.1 deki kodlar konuluyor. Bu kodların yaratma
olasılıgı olan hatanın yanlıs veri girisi oldugu sanılarak, catch meto-
duna ArrayStoreException istisnası konuluyor. 4.satır depoya yanlıs
veri girisi istendigi için sistem beklendigi gibi ArrayStoreException
istisnasını atıyor. Ama catch netoduna geçen program akısı "Integer tip
girmediniz" iletisini vererek yoluna devam ediyor. 11.satırda try-cath
blokundan çıkıyor.
Program 1.1.3.
1 package hata ;
pub l i c c lass ArrayStore1 {pub l i c s t a t i c void main( Str ing [ ] args ) {
6 Object [ ] s = new Integer [ 4 ] ;s [ 5 ] = 12;System . out . print ln ( s [ 5 ] ) ;
}}
/* *Exception in thread "main" java . lang . ArrayIndexOutOfBoundsException : 5
at hata . ArrayStore1 . main( ArrayStore1 . java : 7 )
*/
Açıklama:
Program 6.satırda yaratılan 4 bilesenli Integer arrayi yaratıyor. Arrayin
bileslenlserinin indisleri 0,1,2,3’dür. Sözdizimi dogru oldugu için prog-
ram derleniyor. Kosma anında 7.satır indisi 5 olan bilesene 12 degerini
atamak istiyor. Ama arrayin 5 indisli ögesi olmadıgı için sistem kosma
anında ArrayIndexOutOfBoundsException istisnasını attıyor. Exception
yönetilmedigi için program akısı bu noktada kesiliyor.
Simdi programa try-catch blokunu ekleyerek, program akısının
7.satırda kesilmesini önleyebiliriz:
Program 1.1.4.
1 package hata ;
pub l i c c lass ArrayStore {pub l i c s t a t i c void main( Str ing [ ] args ) {
t r y {6 Object [ ] s = new Integer [ 4 ] ;
s [ 5 ] = 12;} catch ( ArrayIndexOutOfBoundsException e ) {
System . out . print ln ( " Yarat ı lan array ’de 5 i n d i s i yok" ) ;}
11 System . out . print ln ( "Program ak ı s ı devam ediyor " ) ;}
}
/* *2 Yarat ı lan array ’de 5 i n d i s i yok
Program ak ı s ı devam ediyor
*/
6 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
Açıklama:
6.satır 4 bileseneli bir array yaratamaktadır. Bilelenlerin indisleri0,1,2,3
dür. 7.satır indisi 5 olan bilesene 12 sayısını koymak istiyor. Böyle bir bile-
sen olmadıgı için sistem ArrayIndexOutOfBoundsException istisnasını
atıyor. Bu istisna arrayin istenen indisli bileseninin olmadıgını söylüyor.
Atılan exception’u 8.satırdaki catch metodu yakalıyor. Bu metot "Yara-
tılan array’de 5 indisi yok" uyarısını vererek program akısının devamını
saglıyor.
1.1.1 StackTrace
Programın bellekteki yerini bulma
Her program bellekte bir yere yazılır ve deyimler yazılıs sırasıyla
oradan çekilir. Deyimlerin yazıldıgı yere program yıgıtı (Stack) denilir.
Programda düzeltme (debug) için stack’tan gelen bilgiler programcıya
çok yararlı olur. Asagıdaki iki örnek program yıgıtından gelen bilgileri
gösteriyor:
Program 1.1.5.
1 package hata ;
pub l i c c lass Hata01 {
pub l i c s t a t i c void main( Str ing [ ] args ) {6
i n t payda = 0 ;i n t pay = 38 / payda ;
}}
/* *Exception in thread "main" java . lang . ArithmeticException : / by zero
at hata . Hata01 . main( Hata01 . java : 8 )
*/
Bu programı kosturdugumuzda, "sıfıra bölme" (divide-by-zero) isle-
miyle karsılasır. Matematiksel olarak sıfıra bölme islemi olanaksızdır.
Bu durumda, java Runtime sistemi, programın kosmasını keser ve kul-
lanıcıya çıktıda görülen uyarıyı verir ve program akısını keser. Bu uyarı
sunları söylüyor. Atılan hata, Exceptions sınıfının ArithmeticException
adlı alt sınıfı ile belirlenen hatadır. Bu hatanın açıklaması olarak yazılan
( / by zero) kısa mesajı, divide-by-zero (sıfıra bölme) hatası atıldı anlamın-
dadır. Hata01.main(Hata01.java:4 iletisi ise, Hata01, main, Hata01.java,4
verilerinin programın yazıldıgı stack’tan, yazıldıgı sıra ile alındıgını
gösterir.
1.2 Throwable Sınıfı
1.3: RuntimeException
Throwable sınıfı ve alt sınıfları (bkz. Sekil 1.4) java’da istisna yönetimi
yapan araçlardır. Throwable sınıfı önce iki büyük alt sınıfa ayrılır:
1. Exceptions
2. Error
Programın yakalamasını istedigimiz istisnai durumları, Exceptions
sınıfının alt sınıfları ve onlar içindeki metotlarla yaparız. Ayrıca, prog-
ramcı, kendisine gerekli olan sınıfları da buradan türetebilir. Throwable
P RO G R A M H ATA L A R I N I AY I K L A M A 7
1.4: Exceptins
8 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
sınıfının 60 dan çok direk alt sınıfı vardır ve her bir alt sınıfın da baska
alt sınıfları, kurucuları (constructor) ve metotları vardır. Örnegin, çok
kullanacagımız alt sınıflardan birisi RunTimeException sınıfı ile onun alt
sınıfı ArithmeticException sınıfıdır.
1.2.1 Error
Error sınıfı, normal kosullarda programın yakalayamayacagı hataları
sistemin yakalaması içindir. Örnegin OutOfmemory gibi istisnalardır.
Bu gruba giren hataları, normal kosullarda, program içinde çözümleme
olanagı yoktur.Örnegin, bellek yetmezligi (OutOfMemory) hatasını prog-
ram içinde düzeltme olanagı yoktur. Bu tür hatalar, programdan çok,
sistemle ilgili istisnalardır. Çogunlukla, programın kosmasının durma-
sıyla sonuçlanır. Dolayısıyla, bu bölümde o tür istisnaları gidermeye
ugrasmayacagız.
1.2.2 Exception Sınıfı
1.5: Exceptins
Java’da Exception, bir grup deyim kosarken olusan normal dısı bir du-
rumu ifade eden bir kavramdır. Türçe’de istisna, anormal, benzerlerinden
farklı gibi terimlerle açıklanır. Exception program kosarken (runtime) or-
taya çıkar. Exception kavramına yakın Türkçe terim kosma hatası deyimi
olabilir.
Exception yönetimi olmayan dillerde hata ayıklama isi programcı
tarafından elle yapılır. Bu demektir ki, dil exception yönetimini des-
teklemiyorsa, derleme hatalarının hepsi derleme anında listelenir ve
programcı o hataları elle giderir.
Tabii kosma hatalarını derleyici görmez. Dilin sözdizimi kurallarına
uyan kaynak programı derler. Programcının kosma hatalarını önceden
görmesi de mümkün olmayabilir. Java’da ise kosma anında ortaya çıkan
hatalar istisna yönetimi (exception handling) denilen yöntemle program
akısı kesilmeden düzeltilebilir.
P RO G R A M H ATA L A R I N I AY I K L A M A 9
Exceptinon sınıfını niteliklerine göre ikiye ayırmak mümkündür.
1. Checked exceptions (Denetli istisnalar)
2. Unchecked exceptions (denetsiz istisnalar)
1.3 CheckedExceptions
Derleme anında ortaya çıkan istisnalardır. Dolayısıyla derleme anında
denetim altın alınabilirler. Bu tür istisnalar ya try-catch bloku ile ya da
throws anahtar sözcügü ile yönetilebilirler. Bu yapılmazsa, derleme
hatası olusur.
Runtime exception dısında kalan bütün java.lang.Exception türleri
checked exception türüne girer. Bunların baslıcaları
1. ReflectionOperation Exception
2. SQLException (java.sql)
3. IOException (java.io)
alt sınıflarıdır. Tabii buların da alt sınıfları vardır.
1.4 Örnekler:
Program 1.4.1 yönetilmeyen bir CheckedException örnegidir.Derleme
hatası olusur.
Program 1.4.1.
1 pub l i c c lass CheckedException{
pub l i c s t a t i c void main( Str ing [ ] args ) throws ClassNotFoundException{
Class . forName( "AnyClassName" ) ;6 }
}
/* *Exception in thread "main" java . lang . ClassNotFoundException : AnyClassName
3 at java . net . URLClassLoader . f indClass (Unknown Source )at java . lang . ClassLoader . loadClass (Unknown Source )at sun . misc . Launcher$AppClassLoader . loadClass (Unknown Source )at java . lang . ClassLoader . loadClass (Unknown Source )at java . lang . Class . forName0 ( Native Method)
8 at java . lang . Class . forName(Unknown Source )at hata . Checked . main( Checked . java : 5 )
*///$
Program 1.4.2 yukarıdaki programın yönetilmis durumudur. Yönetil-
digi için CheckedException istisnası derleme hatası olmadan asılır.
Program 1.4.2.
package hata ;
pub l i c c lass Checked {4 pub l i c s t a t i c void main( Str ing [ ] args ) {
t r y {Class . forName( " Bir S ı n ı f ad ı " ) ;
} catch ( ClassNotFoundException ex ) {System . out . print ln ( "ClassNotFoundException bu blokta yakalan ı r " ) ;
9 }}
}
/* *ClassNotFoundException bu blokta yakalan ı r
*/
10 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
1.6: Checked ve Unchecked istisnalar
1.5 UncheckedExceptions
UncheckedExceptions istisnaları kosma anında ortaya çıkar. Bunlar
derleme anında görülmezler. O nedenle bu türlere kosma anı istisnaları
(Run Time Exceptions) denilir. RunTime Exception ve Error sınıfı ile
bütün alt sınıfları UncheckedExceptions türüne girer.
UncheckedExceptions try-cath bloku ile ya da throws anahtar söz-
cüpgü ile yönetilmezse, derleme anında istisna dogmaz. Bu durumda
program derlenir ama kosamayabilir. O nedenle, programcı bu tür istis-
naları yönetmelidir.
Program1.5.1 derleme anında NumberFormatException istisnası atar.
Prograqm kosmaz.
Program 1.5.1.
pub l i c c lass UncheckedException2 {
pub l i c s t a t i c void main( Str ing [ ] args ){
i n t i = Integer . parseInt ( "Unchecked Exception " ) ;
7 // Yukar ı daki deyim Unchecked türügnden olan NumberFormatExceptioni s t i s n a s ı olu s turur . Dolay ı s ı yla program hemen k e s i l i r .
}}
1 /* *Exception in thread "main" java . lang . NumberFormatException : For input s t r i n g :
"Unchecked Exception "at java . lang . NumberFormatException . forInputString (Unknown Source )at java . lang . Integer . parseInt (Unknown Source )at java . lang . Integer . parseInt (Unknown Source )
6 at hata . Unchecked . main( Unchecked . java : 5 )
*/
Program1.5.2 try-catch bloku ile Program1.5.1’i kosabilir duruma soku-
yor.
Program 1.5.2.
package hata ;
P RO G R A M H ATA L A R I N I AY I K L A M A 11
3 pub l i c c lass Unchecked{
pub l i c s t a t i c void main( Str ing [ ] args ){
t r y8 {
i n t i = Integer . parseInt ( "Unchecked i s t i s n a s ı " ) ;
// Yukar ı daki deyim Unchecked türünden olan NumberFormatExceptioni s t i s n a s ı olu s turur
}13 catch ( NumberFormatException e )
{System . out . print ln ( "NumberFormatException bu blokta yakalan ı r " ) ;
}System . out . print ln ( "Program ak ı s ı yoluna devam eder " ) ;
18 }}
1 /* *NumberFormatException bu blokta yakalan ı rProgram ak ı s ı yoluna devam eder
*/
1.5.1 Besi bir yerde
Java exceptin yönetimini bes anahtar sözcükle yapar:
• try
• catch
• throw
• throws
• finally
Exception yönetim bloku’nun genel sözdizimi (syntax) söyledir:
1 t r y {// Exception yaratma olas ı l ı g ı olan deyimler}
catch ( ExceptionTipi1 obj1 ){
6 // ExceptionTipi1 i ç in yönetim deyimleri}
catch ( ExceptionTipi2 obj2 ){// ExceptionTipi2 i ç in yönetim deyimler
11 }
// . . .f i n a l l y {
// exception yönetim bloku bitmeden mutlaka i s lenmesi istenen deyimler16 }
1.6 Exception yönetim bloku
Yukarıdaki listeden görüldügü gibi Exception yönetim bloku try blokunu
izleyen catch metotları ile onları izleyen istemli (optional) finally
blokundan olusur. Yapının en sonuna finally bloku yazılır. Exception
yönetim bloku sona ermeden mutlaka islemesi istenen deyimler varsa
onlar finally bloku içine yazılır.
Literatürde Exception yönetim bloku’na try-cath bloku denilir. Kolay
algılandıgı için bu deyim uygundur. Ama söz konusu blok, birden çok
bloku içeren bir bloklar grubudur. O nedenle vurgulamak gerektiginde
try-cath bloku yerine Exception yönetim bloku diyecegiz.
12 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
1.6.1 try
Programda kosma anında hata üretme olasılıgı olan deyimler try bloku
içine yazılır. Gerçekten bu blokta bir istisna olusursa sistem bir hata
iletisi atar. Atılan sey Throwable sınıfıdır ya da onun alt sınıflarından
birisidir; yani onu genisleten sınıflardan birisidir. Atılan hata catch
metodu içinde yakalanır. Eger programcı atılan hatayı yönetmezse,
sistemin verdigi öntanımlı (default) ileti ekrana çıkar. Ama programcı
atılan exception’u yönetmek isterse, cath metodu içine yöneten deyimleri
yazar. Try, Exception yönetim bloku içindeki bloklardan birisidr.
1.6.2 catch
Try bloku içinde Exception atılır atılmaz dogrusal program akısı durur,
ama program akısı kesilmez. Yalnızca try blokunda exception’u yaratan
deyim ve ondan sonraki deyimler atlanır. Program akısı try blokunu
izleyen catch metotlarını sırayla denetlemeye baslar. Try blokundan
sonra gelen ve atılan exception tipinden parametreye sahip olan ilk
catch metodu atılan exception’u yakalar.
Özetle catch metodu atılan istisnayı yakalamaya yarar. Bir tek try
blokunu birden çok catch metodu izleyebilir. Baska bir deyisle, Try
blokunun farklı istisnalar üretme olasıgı varsa, her birisi için bir catch
metodu yazılır. Böylece farklı istisnalar farklı catch metotlarında yöneti-
lir.
Bir exception atuldıgpında, onıu yaklayan catch metodu çalısır. Ör-
negin bir aritmetik exception olusmussa, catch metotlarından yalnız
arithmetikle ilgili olanı çalısır. Bu durum biraz switch-case yapısına
benziyor, ama ondan farklıdır.
1.7: Exception sınıfı
1.6.3 throw
Kosma anında (runtime) sistemin attıgı exception yerine programcı
kendisi atılacak exception’u throw anahtar sözcügü ile atabilir. Throw’un
genel biçimi söyledir:
P RO G R A M H ATA L A R I N I AY I K L A M A 13
throw ThrowableNesnesi
Burada ThrowableNesnesi (atılabilir nesne), Throwable sınıfı ya da onun
bir alt sınıfıdır. int, char gibi ilkel veriler ile String, Object gibi
sınıflar exception olarak atılamaz.
Program 1.6.1.
package hata ;
pub l i c c lass ThrowDemo {4 s t a t i c void uygunluk ( i n t yas , i n t ag ı r l ı k ) {
i f ( ya s < 12 && ag ı r l ı k < 40) {throw new ArithmeticException ( "Kulübe ü y e l i g i uygun deg i l " ) ;
} else {System . out . print ln ( "Kulübe ü y e l i g i uygun ! " ) ;
9 }}
pub l i c s t a t i c void main( Str ing [ ] args ) {System . out . print ln ( "Kay ı t i s lemleri bas l ı yor ! " ) ;
14 uygunluk (10 , 39) ;System . out . print ln ( "Gül e gül e ! " ) ;
}}
/* *Kay ı t i s lemleri bas l ı yor !
3 Exception in thread "main" java . lang . ArithmeticException : Kulübe ü y e l i g i uygundeg i l
at hata .ThrowDemo. uygunluk (ThrowDemo. java : 6 )at hata .ThrowDemo. main(ThrowDemo. java : 1 4 ) 6) )
*/
Açıklama:
main metodunun ilk deyimi olan "Kayıt islemleri baslıyor!" yazılıyor.
14.satırda yas=10 ve agırlık=39 olan üye için uygunluk() metodu çalısıyor.
yas < 12 oldugu için 6.satırda bildirimi yapılan ArithmeticException
istisnası throw anahtar sözcügü ile atılıyor. Atma islemini sistem degil
programcı yapıyor. Bu istisna "Kulübe üyeligi uygun degil" uyarısını
yazıyor. Ilk istisnanın olustugu yer main içindeki 14. satırdır. Bu satırdaki
deyim 6.satırdan gelmektedir.
1.7 Exception’un yakalanısı
Exception atılır atılmaz dogrusal program akısı durur, ama program
akısı kesilmez. Yalnızca try blokunda exception’u yaratan deyim ve
ondan sonraki deyimler atlanır. Program akısı try blokunu izleyen catch
metotlarını sırayla denetlemeye baslar. Try blokundan sonra gelen ve
atılan exception tipinden parametreye sahip olan ilk catch metodu
atılan exception’u yakalar.
Atılan sey, Throwable sınıfı ya da onu genisleten sınıflardan birisidir.
Yakalama eylemi, atılan exception sınıfının adı ile catch metodunun
parametresinin aynı olmasıdır.
Atılan exception bir catch metodu tarafından ya deyimleri sırasıyla
isledikten sonra Exception yönetim bloku’ndan çıkar ve sonraki yoluna
devam eder.
Bir catch metodu atılan exception’u yakalamamıssa, program akısı
ondan sonraki catch metodunu dener. Eger hiç bir catch metodu atılanı
yakalamamıssa, en son catch metodu olarak öntanımlı (default, generic)
catch çalıstırılabilir. Öntanımlı catch metodu sistem tarafından yönetilir;
14 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
çogunlukla kullanıcıya olusan hata ile ilgili yararlı bilgiler sunmaz ve
exception’u yönetmez. O nedenle Exception yönetim blokuna müm-
künse atılan exception’ları yakalayacak sayı ve nitelikte catch metodu
konmalıdır.
1.8 throws
throws bir metodun atması olasılıgı olan istisnaların metot adından
sonra listelenmesidir. throws terimi throw teriminden farklı kullanılır.
Sözdizimi söyledir:
Program 1.8.1.
pub l i c void metod_ad ı ( ) throws Exception1 , Exception2 , . . . , ExceptionN{
t r y4 {
deyimler}catch ( Exception1 ex1 ){
9 deyimler}
. . .
14 catch ( ExceptionN exN){
deyimler}
}
Program 1.8.2.
pub l i c c lass ThrowsDemo {2
s t a t i c void at ( ) throws I l legalAccessException {System . out . print ln ( " at ( ) i çindeyim " ) ;throw new I l legalAccessException ( " Eri sim yok" ) ;
}7
pub l i c s t a t i c void main( Str ing args [ ] ) {t r y {
at ( ) ;} catch ( I l legalAccessException e ) {
12 System . out . print ln ( "main i çinde yakaland ı " ) ;}
}}
/*java . lang . I l legalAccessException : Eri sim Yok
at ThrowsDemo . at (ThrowsDemo . java : 5 )
*/
Açıklama:
main metodu ilkönce at() metodunu çagırıyor. Bildiriminde 3.sa-
tırda at() metodu throws anahtar sözcügü ile IllegalAccessException
istisnasını atıyor. Atılan bu istisnayı yönetnek için 5.satırdaki throw de-
yimi kullanılıyor. Ancak 3. satırda atılan istisnanın referansı (pointer) yok.
O nedenle IllegalAccessException istisnasına erisilemiyor. Dolayısyla
bu deyim istisnayı atıyor. Atılan istisna main metodu içinde 11.satırdaki
catch metodu tarafından yakalanıyor. Sonra program akısı Exception
yönetim blokundan çıkıp yoluna devam ediyor.
P RO G R A M H ATA L A R I N I AY I K L A M A 15
1.8.1 finally
Program 1.8.3.
1 package hata
c lass FinallyBlock {pub l i c s t a t i c void main( Str ing args [ ] ) {t r y {
6 i n t data =25/5;System . out . print ln ( data ) ;
}catch ( NullPointerException e ) { System . out . print ln ( e ) ; }f i n a l l y { System . out . print ln ( " f i n a l l y bloku daima ç a l ı s ı r " ) ; }
11 System . out . print ln ( " Sonraki deyimler " ) ;}System . out . print ln ( " Bloktan sonra yola devam" ) ;
}
1 /*Exception in thread "main" java . lang . Error : Unresolved compilation problem :
at hata . FinallyBlock . main( FinallyBlock . java : 4 )
*/
1.8: finally
1.9 istisna Örnekleri
1.9.1 ArithmeticException
Java.lang.ArithmeticException istisnası sıfıra bölme islemi yapılmak
istenirse olusur.
Program 1.9.1.
package hata ;
c lass Arithmetic {void method1 ( ) throws ArithmeticException {
5 throw new ArithmeticException ( "Hesap hatas ı " ) ;}
void method2 ( ) throws ArithmeticException {method1 ( ) ;
10 }
void method3 ( ) {t r y {
method2 ( ) ;15 } catch ( ArithmeticException e ) {
System . out . print ln ( " ArithmeticException yö n e t i l d i " ) ;}
}
20 pub l i c s t a t i c void main( Str ing args [ ] ) {Arithmetic obj = new Arithmetic ( ) ;obj . method3 ( ) ;System . out . print ln ( "Program sonu" ) ;
}25 }
Exception in thread "main" java . lang . Error : Unresolved compilation problems :Example1 cannot be resolved to a typeExample1 cannot be resolved to a type
5 at hata . Arithmetic . main( TestPersonThrow . java : 1 9 )
1.9.2 throws
Bir metot yönetilmeyen bir exception atımı yapıyorsa, bu özeligi belirt-
melidir ki o metodu çagıranlar gerekli önlemi alabilsinler. Bunu yapmak
için , metot bildiriminde metot adının sonuna throws anahtar sözcügü
16 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
ve onu izleyen exception’lar listesi eklenir. Throws anahtarsözcügü me-
todun atma olasılıgı olan bütün exception’ları listelemelidir. Bu eylem,
RuntimeException ve onun alt sınıflarına ait exception’lar dısındaki
bütün exception’lar için gereklidir. Sözdizimi söyledir:
Program 1.9.2.
c lass TestPersonThrows {p r i va te i n t sa la ry = 0 ;p r i va te i n t age = 0 ;pub l i c i n t getSalary ( ) throws RuntimeErrorException {
5 i f ( s a l ary < 0 )throw new RuntimeException ( "ücret negat i f olamaz" ) ;
re tu rn sa la ry ;}
10 pub l i c i n t getAge ( ) throws Throwable {i f ( age < 0 )
throw new RuntimeException ( "ya s negat i f olamaz" ) ;re tu rn age ;
}15
pub l i c i n t getMaxSalary ( ) throws IOException , NumberFormatException {// database operation .//may throw IOException or NumberFormatExceptionre tu rn 0 ;
20 }}
/* *v e r i _ t i p i metot_ad ı ( parametre l i s t e s i ) throws exception ’ l a r l i s t e s i{
4 // metot gövdesi}
*/
Burada exception’lar listesi birbirlerinden virgül ile ayrılan ve metodun
atabilecegi exception’lardır.
Asagıdaki program yakalanmayan bir exception atıyor. Çünkü prog-
ram throws cümlecigini kullanmıyor.
Program 1.9.3.
package hata ;c lass Demo {
4 // Bu program derlenmez .s t a t i c void throwBir ( ) {
System . out . print ln ( " throwBir i çinde . " ) ;throw new I l legalAccessException ( "demo" ) ;
}9 pub l i c s t a t i c void main( Str ing args [ ] ) {
throwBir ( ) ;}
}
Bu program 6.satıra kadar (6.dahil) derleniyor. 7.satırdaki
\ t e x t t t { I l legalAccessException }
nesnesini yaratamadıgı için derlenemez.
Eclipse su hatayı verir:
/* *Exception in thread "main" java . lang . Error : Unresolved compilation problem :
Unhandled exception type Il legalAccessException4
at hata .Demo. throwBir (Demo. java : 7 )at hata .Demo. main(Demo. java : 1 0 )
*/
Program 1.9.4.
P RO G R A M H ATA L A R I N I AY I K L A M A 17
package hata ;
3 pub l i c c lass ThrowableMethods {s t a t i c void A ( ) {
i n t x = 100;i n t y = 0 ;i n t z = x / y ;
8 }
pub l i c s t a t i c void main( Str ing [ ] args ) {t r y {
A ( ) ;13 } catch ( ArithmeticException e ) {
System . out . print ln ( " StackTrace b i l g i l e r i n i gö s t e r i y o r " ) ;e . printStackTrace ( ) ;System . out . print ln ( " \ nBeklentinin aç ı klamas ı : " + e . getMessage ( ) ) ;System . out . print ln ( " \ nBeklentiyi aç ı klayan String " ) ;
18 System . out . print ln ( e . toStr ing ( ) ) ;}
}}
/* *StackTrace b i l g i l e r i n i gö s t e r i y o rjava . lang . ArithmeticException : / by zero
4 at except . ThrowableMethods . A( ThrowableMethods . java : 7 )at except . ThrowableMethods . main( ThrowableMethods . java : 1 2 )
Beklentinin aç ı klamas ı : / by zero
9 Beklentiy i aç ı klayan Stringjava . lang . ArithmeticException : / by zero
*/
Açıklama:
4-8.satırlar satic A() metodunun bildirimidir. Bu metodun 7.satısın-
daki iselem gerçeklesemedigi için 11.satırdaki çagrı ArithmeticException
atar. Atılan bu exceptionu 13.satırdaki catch metodu yakalar.
15. satır programda olusan ve referansı e olan kodları listeler.16.satırdaki
e.getMesage() metodu açıkalamnın bir String oldugunu söylüyor. 18.sa-
tır e referansının gösterdigi sınıfı ve olusan hata türünü veriyor.
Program 1.9.5.
package hata ;
pub l i c c lass Demo {4
pub l i c s t a t i c void main( Str ing args [ ] ) {i n t a , b ;t r y {
/*9 * bu blokta exception olabi lece g i n i tahmin ediyoruz .
*/a = 0 ;b = 81 / a ;System . out . print ln (b) ;
14 System . out . print ln ( " t r y blokunun sonunday ım" ) ;} catch ( ArithmeticException e ) {
/** Ancak bir Arithmetic exception olu s ursa bu blok ç a l ı s ı r .
*/19 System . out . print ln ( "Say ı l a r s ı f ı ra bö l ünemez" ) ;
} catch ( Exception e ) {/*
* Buras ı öntan ı ml ı ( generic , default ) yönetimdir . Bütün exceptionlar ıyö n e t i r .
* Bundan önceki catch metotlar ı n ı n hi ç b i r i s i ç a l ı smazsa bu metot ç a l ı s ı r .24 */
System . out . print ln ( " Exception olu s tu " ) ;}System . out . print ln ( " Exception yönetim blokunun d ı s ı na ç ı kt ım. " ) ;
}29 }
1 /* *Say ı l a r s ı f ı ra bö l ünemzException yönetim blokunun d ı s ı na ç ı kt ım.
*/
18 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
Açıklama:
7.satırdaki try bloku 12. satırdaki bölme islemini yapamadıgı için
ArithmeticException atıyor. Program akısı exception olusunca dogru-
sal akısı durduruyor. 13. ve 14. satırlar atlanıyor. Program akısı 15.satıdaki
cath metoduna giditor. catch metodunun parametresi atılan exception
ile aynı oldugu için, program 15.satırdaki catch metodunu çalıstırıyor.
Bu eylemi, catch metodu atılan exceptionu yakaladı diye ifade ediyo-
ruz. Cath metodu kullanıcıya Sayılar sıfıra bölünemez iletisini gönderip
bloktan çıkıyor ve 27.satıra atlıyor.
20.satırdaki catch metodunun parametresi Exception sınıfıdır. Bu
sınıf bütün exception’lar için kullanılabilir. Dolayısıyla özel bir exception
için kullanıcıya yararlı bilgiler veremez. Zaten atılan exception önceki
catch metodu ile yakalandıgı için, program akısı sondaki cath metodunu
atlar ve exception yönetim blokunun dısına çıkar. Çıktıya dikkat edilirse
25.satırın çalısmadıgı görülür. Program akısı exception yönetim bloku-
nun dısındaki 27.satırı çalıstırır. Program akısı, ondan sonraki deyimleri
islemeye baslyacaktır.
Generic ya da default catch diye adlandırdıgımız ve parametresi
Exception sınıfı olan catch metudu sonuncu catch metodu olarak
yazılmalıdır. Program akısı catch metotlarını yazılıs sırasıyla ziyaret ettigi
için, önce yazılan generic catch metodu atılan exceptionu yakalar ve
program akısı exception yönetim blokunun dısına çıkar. Dolayısıyla asıl
yakalama eylemini yapacak catch metoduna hiç ugrmaz11 Java 8 derleyicisi generic catch önealındıgında derleme hatası veriyor. Buileti, programcı için iyi bir uyarıdır.
1.10 Yakalanan istisnayı tekrar atma
Atılan bir exception onu yakalayan catch bloku tarafından yönetilebi-
lecegi gibi, gerekirse catch metodu onu tekrar atabilir. O zaman tekrar
atılan exception’u baska bir catch metodu yakalayabilir.
Asagıdaki program atılan bir exceptionu yakalıyor ve onu tekrar atıyor.
Program 1.10.1.
1 package hata ;
pub l i c c lass RethrowingExceptions {s t a t i c void divide ( ) {
i n t x , y , z ;6 t r y {
x = 6 ;y = 0 ;z = x / y ;System . out . print ln ( x + " / " + y + " = " + z ) ;
11 } catch ( ArithmeticException e ) {System . out . print ln ( " Exception divide ( ) metodu i çinde bas lad ı " ) ;System . out . print ln ( "S ı f ı ra bö l ünemez" ) ;throw e ; // Rethrows an exception
}16 }
pub l i c s t a t i c void main( Str ing [ ] args ) {System . out . print ln ( "main ( ) bas lad ı " ) ;t r y {
21 divide ( ) ;} catch ( ArithmeticException e ) {
System . out . print ln ( "main ( ) t a r a f ı ndan yakalanan exception tekrarat ı l ı yor " ) ;
System . out . print ln ( e ) ;}
26 }}
P RO G R A M H ATA L A R I N I AY I K L A M A 19
/* *main ( ) bas lad ı
3 Exception divide ( ) metodu i çinde bas lad ıS ı f ı ra bö l ünemezmain ( ) t a r a f ı ndan yakalanan exception tekrar at ı l ı yorjava . lang . ArithmeticException : / by zero
*/
Açıklama:
4.satırda bildirimi yapılan divide() metodu 6.satırdaki try, 11.sa-
tırdaki catch ve 14.satırdaki throw bloklarından olusan bir exception
yönetim bloku tanımlıyor.
divide() metodu static oldugu için, nesne yaratmaya gerek kal-
madan main() metodu tarafından 21.satırda çagrılıyor. Çagrılan di-
vide() metodunun 9.satırı istenen bölme islemini yapamadıgı için
ArithmeticException exception’i atıyor. Atılan exception 11.satırda bil-
dirimi yapılan catch metodu tarafından yakalanıyor. 14.satırda bildirimi
yapılan throw yakalanan exception’u tekrar atıyor. main() metodunun
22.satırındaki catch metodu 14.satırla tekrar atılan exceptionu yakalıyor.
24.satır yakalanan exceptionu yazıyor.
Asagıdaki program atılan bir exceptionu yakalıyor ve onu tekrar atıyor.
Program 1.10.2.
package hata ;
3 /* *** @author timur
*/c lass Demo {
8
s t a t i c void demoproc ( ) {t r y {
throw new NullPointerException ( "örnek" ) ;} catch ( NullPointerException e ) {
13 System . out . print ln ( " exception demoproc i çinde yakaland ı . " ) ;throw e ; // exceptionu yeniden at ı ld ı
}}
18 pub l i c s t a t i c void main( Str ing args [ ] ) {t r y {
demoproc ( ) ;} catch ( NullPointerException e ) {
System . out . print ln ( "Yeniden yakaland ı : " + e ) ;23 }
}}
/* *demoproc i çinde yakaland ı .Yeniden yakaland ı : java . lang . NullPointerException : örnek
*/
Açıklama:
Bu program istisnayı yönetmek için iki araca sahiptir. Birincisi main()
içinde yer alan demoproc() metodudur. Bu metot, 11.satırda atılan
istisnayı 12.satırdaki catch metodu ile yakalıyor. Static oldugu için
demoproc() metodu nesne yaratmadan 20.satırda çagrılıyor. Yakalanan
istisna 14.satırda yeniden atılıyor. 21.satır onu tekrar yakalıyor.
Program 1.10.3.
1 package hata ;
pub l i c c lass SeçemeHakkı {
20 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
pub l i c boolean o y v e r e b i l i r ( i n t age ) {6
t r y {i f ( age < 18) {
throw new OlmayanAgeException ( "Seçme hakk ı yok" ) ;}
11 } catch ( Exception e ) {System . out . print ln ( e ) ;
}re tu rn fa l se ;
}16
pub l i c s t a t i c void main( Str ing agrs [ ] ) {
ThrowDemo obj = new ThrowDemo( ) ;obj . o y v e r e b i l i r (17) ;
21 }}
Exception in thread "main" java . lang . Error : Unresolved compilation problems :ThrowDemo cannot be resolved to a type
3 ThrowDemo cannot be resolved to a type
at hata . SeçemeHakkı . main( SeçemeHakkı . java : 1 9 )
Açıklama:
9.satırda programcı kendisi throw anahtar sözcügünü kullanarak
OlmayanAgeException adlı bir exception atıyor. Bu sınıf daha önce ta-
nımlanmadıgı için nesnesi yaratılamıyor ve dolayısıyla 19.satır exception
üretiyor. Atılan sınıf tanımsız oldugu için 11. satırdaki generic catch me-
todu onu yakalıyamıyor. Dolayısıyla program 19.stırda derleme hatasıyla
sona eriyor.
1.10.1 ArrayIndexOutOfBoundsException
Program 1.10.4 yaratılan arrayin mevcut indislerinde olmayan bir indis
istenirse ArrayIndexOutOfBoundsException istisnasını atıyor.
Program 1.10.4.
package hata ;
pub l i c c lass IndisHatas ı {
5 pub l i c s t a t i c void main( Str ing Args [ ] ) {i n t [ ] array = new i n t [ 3 ] ;t r y {
f o r ( i n t i = 0 ; i < 4 ; ++ i ) {array [ i ] = i ;
10 }System . out . print ln ( array ) ;
} catch ( ArrayIndexOutOfBoundsException e ) {System . out . print ln ( " I ndis as ımı " ) ;
}15 System . out . print ln ( " Exception yönetim blokunun d ı s ı nday ım. " ) ;
}}
/* *I ndis as ımı
3 exception yönetim blokunun d ı s ı nday ım.
*/
Açıklama:
6.satır 3 bilesenli bir array yaratıyor. Arrayin indisleri 0,1,2 dir.
7.satırda baslayan try blokunun 8.satırı i < 4 deyimi ile indisi 3 olan
bileseni istiyor. 3 indisi olmadıgı için for döngüsü i = 3 oldugunda
ArrayIndexOutOfBoundsException istisnasını atıyor.Atılan exception
12.satırdaki catch metodu tarafından yakalanıyor. Bu metot hatayı düzelt-
miyor ama Indis asımı iletisini verip program akısını exception yönetimi
P RO G R A M H ATA L A R I N I AY I K L A M A 21
blokunun dısına gönderiyor. 15.satır sözkonusu blokun dısındadır ve
program akısı o satıra geldigi için "Exception yönetim blokunun dısında-
yım." iletisini yazıyor.
1.10.2 ClassNotFoundException
ClassNotFoundException istisnası program kosarken bir sınıfı Class.forName()
ya da findSystemClass() metodu ile yüklemek istiyor ama istenen sınıf
bulunamıyor ise olusur.
Program 1.10.5.
1 package hata ;
pub l i c c lass ClassYok {
pub l i c s t a t i c void main( Str ing [ ] args )6 {
t r y{
Class . forName( " oracle . jdbc . driver . OracleDriver " ) ;} catch ( ClassNotFoundException e )
11 {e . printStackTrace ( ) ;
}}
}
/* *java . lang . ClassNotFoundException : oracle . jdbc . driver . OracleDriver
at java . net . URLClassLoader . f indClass (Unknown Source )at java . lang . ClassLoader . loadClass (Unknown Source )
5 at sun . misc . Launcher$AppClassLoader . loadClass (Unknown Source )at java . lang . ClassLoader . loadClass (Unknown Source )at java . lang . Class . forName0 ( Native Method)at java . lang . Class . forName(Unknown Source )at hata . ClassYok . main( ClassYok . java : 1 3 )
10 */ $
Açıklama:
Programın 9.satırı oracle.jdbc.driver.OracleDriver sınıfını istiyor,
ama o sınıf import edilmedigi için programda yok. Dolayısıyla 9.satır
ClassNotFoundException istisnasını atıyor. 10.satırda baslayan cath
metodu istisnayı yakalıyor.
e.printStackTrace() deyimi programda hatanın olustugu satırları
stack’tan yazıyor. Stack’tan alınan bu bilgiler programın düazeltilmesi
(debug) için gerekli bilgileri programcıya sunuyor. Tabii, kaynak prog-
ramda düzeltme gerektigi için catch metodunun yaptıgı is kosma anını
devam ettirmek yerine debug için gerekli bilgiyi vermekle yetiniyor. Zaten
programın bu haliyle kosması bir ise yaramaz.
1.10.3 IllegalAccessException
java.lang.IllegalAccessException istisnası, uygulama array dısında
bir nesne yaratmak ya da bir set veya bir veri alanı (field) almak istedi-
ginde, kullandıgı metot istedigi ögeye erisim iznine sahip degilse olusur.
Tipik örnegi private ta da protected nitelemli ögelere erisilmek istendi-
ginde olusan IllegalAccessException istisnasıdır. Protected nitelemli
paketlere ya da sınıf ögelerine erisilmek istenince de benzer olay olusur.
Program 1.10.6.
22 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
package hata ;
import java . u t i l . * ;import java . lang . * ;
5
pub l i c c lass I l l e g a l A c c e s s {
pub l i c s t a t i c void main( Str ing [ ] args ) {
10 t r y {// date objectDate d = new Date ( ) ;Class c l s = d . getClass ( ) ;System . out . print ln ( "Time = " + d . toStr ing ( ) ) ;
15
/** creates a new instance of the c l a s s represented by t h i s Class object
c l s
*/Object obj = c l s . newInstance ( ) ;
20 System . out . print ln ( "Time = " + obj ) ;} catch ( InstantiationException e ) {
System . out . print ln ( e . toStr ing ( ) ) ;} catch ( I l legalAccessException e ) {
System . out . print ln ( e . toStr ing ( ) ) ;25 }
}}
Exception in thread "main" java . lang . Error : Unresolved compilation problem :
3 at hata . I l l e g a l A c c e s s . main( ClassYok . java : 9 )
*/
Açıklama:
1.10.4 InstantiationException
Genellikle bir arayüzden ya da soyut bir sınıftan nesne yaratılmak iste-
yince ortaya çıkar.
Program 1.10.7.
1
package hata ;
6 pub l i c c lass PersonThrow {
p r i va te i n t sa la ry = 0 ;p r i va te i n t age = 0 ;
11 pub l i c i n t getSalary ( ) {i f ( s a l ar y < 0)
throw new RuntimeException ( " Salary cannot be l e s s than zero " ) ;re tu rn sa la ry ;
}16
pub l i c i n t getAge ( ) {i f ( age < 0)
throw new RuntimeException ( "Age cannot be negative " ) ;re tu rn age ;
21 }}
main ( ) bas lad ıException divide ( ) metodu i çinde bas lad ı
3 S ı f ı ra bö l ünemezmain ( ) t a r a f ı ndan yakalanan exception tekrar at ı l ı yorjava . lang . ArithmeticException : / by z
*/
1.10.5 finally
Try bloku sona ermeden önce mutlaka çalısması istenen deyimler finally
bloku içine yazılır. finally bloku exception yönetim blokunun sonuna
P RO G R A M H ATA L A R I N I AY I K L A M A 23
gelmelidir. Ama her exception yönetim blokunun sonuna bir finally
bloku koymak gerekemez. Ancak her try blokundan sonra ya catch ya
da finally ya da her ikisi birden konmalıdır. Finally blokunun kullanıldıgı
tipik örneklerden birisi progamın açtıgı dosyaların kapanması eylemin-
dedir. Programın açtıgı bir dosya exit() ile kapanır. Dolayısıyla catch
blokunda dosyayı kapatan bir deyime gerekseme dogmaz. Bu is finally
blokunda yapılabilir.
Exception yönetim blokunda birden çok catch metodu varsa, atılan
istisnayı ancak birisi yakalayabilir. Yakalayan catch blokundaki bütün
deyimler çalısır ve blokun isi biter. Program akısı o bloktan sonra baska
catch blokuna girmez. catch bloklarının hepsini atlar varsa finally
blokuna girer ve oradaki bütün deyimleri isledikten sonra Exception
yönetim blokundan çıkar ve sonraki deyimleri isleyerek yoluna devam
eder.
Exception yönetim blokunda blokunda finally bloku yoksa, program
akısı atılan exceptionu yakalayan catch blokunu isledikten sonra Excep-
tion yönetim blokundan çıkar ve ve sonraki deyimleri isleyerek yoluna
devam eder.
Program 1.10.8.
c lass Student {pub l i c s t a t i c void main( Str ing [ ] arg ) {
4 t r y {i n t sa la ry = Integer . valueOf ( "NumberFormatException" ) ;
} catch ( Exception exp ) {System . out . print ln ( " exception ’u yöneten block " ) ;
} f i n a l l y {9 System . out . print ln ( " f i n a l l y bloku ç a l ı s ı yor " ) ;
}}
}
/* *Executing exception block
3 Executing f i n a l l y block
*/
Program 1.10.9.
1 package hata ;
c lass IllegalAccessDemo {
s t a t i c void i s t i s n a A t ( ) throws I l legalAccessException {6 System . out . print ln ( " i s t i s n a A t i çinde . " ) ;
throw new I l legalAccessException ( "demo" ) ;}
pub l i c s t a t i c void main( Str ing args [ ] ) {11 t r y {
i s t i s n a A t ( ) ;} catch ( I l legalAccessException e ) {
System . out . print ln ( "Yakaland ı " + e ) ;}
16 }}
/* *i s t i s n a A t i çinde .
3 Yakaland ı java . lang . I l legalAccessException : demo
*/
Açıklama:
Program (??) throwBir() adlı bir metot bildiriyor. Metot static oldugu
için 12.satırdaki gibi try bloku içinde çagrılabiliyor. Çagrılınca metot için-
deki 7.satır throw anahtar sözcügü ile IllegalAccessException(“demo”)
24 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
yu atıyor. 13.satırdaki catch bloku onu yakalıyor. 14.satır yakalanan ex-
ceptionu yazıyor.
1.11 Örnekler
Program 1.11.1.
1 pub l i c c lass arithmetic{
s t a t i c i n t a=12;s t a t i c i n t b=6;s t a t i c i n t c ;
6 pub l i c s t a t i c void main( Str ing [ ] args ) {
c =a/b ;System . out . print ln ( c ) ;
}11 }
Progran (1.11.1) içindeki deyimler arasında exception üretme olasılıgı
olan hiç bir deyim göremiyoruz. O nedenle bu programda try-catch
blokuna gerekseme duymuyoruz. Ama a,b sayılarını programcı bilmiyor
olabilir. Örnegin o sayılar bir veritabanından, baska bir dosyadan ya
da kullanıcı girisinden gelebilir. O durumda, örnegin b sayısının sıfır
olmayacagını programcı garanti edemez. Kosma anında b = 0 oldugunda
programın kesilmesini önleyecek bazı önlemler alınabilir. Bunu yapmaya
istisna yönetimi (exception handling) diyoruz.
Simdi 4.satırı b = 0 olarak degistirelim. Program (1.11.2) derlenecek
ama kosma anında hata verecektir. Program derleme hatası vermedigi
halde kosma anında (Runtime) java.lang.ArithmeticException ha-
tası oldugunu söylüyor ve program 11. satırı islemeden kesiliyor. Hatanın
nedeni bilindigine göre, program akısını kesmeden, hatayı giderecek bir
yöntem iyi olur. Bunun için istisna yönetimi (exception handling) denen
yöntemi kullanacagız. Hatayı yaratan deyimin 8.satırdaki c = a/b deyimi
olduguna göre o deyimi try bloku içine, onu düzeltecek deyimleri de
catch bloku içine yazalım:
Program 1.11.2.
\begin { l s t l i s t i n g }4 package hata ;
c lass Demo {s t a t i c i n t a = 12;s t a t i c i n t b = 0 ;
9 s t a t i c i n t c ;
pub l i c s t a t i c void main( Str ing [ ] args ) {System . out . print ln ( "Bu deyim ç a l ı s t ı " ) ;c = a / b ;
14 System . out . print ln ( "Bu deyim ç a l ı smadı " ) ;}
}
/* *Exception in thread "main" java . lang . ArithmeticException : / by zero
*/
hatasını veriyor. catch bir metottur. Metodun parametrsi ArithmeticE-
xception sınıfıdır. Bu sınıfın referansı (pointer) e harfidir. catch bloku
içine hatayı gidermek için c = 0 deyimini koyuyoruz. Ancak bu deyimden
P RO G R A M H ATA L A R I N I AY I K L A M A 25
önce kullanıcıya hatanın ne oldugunu bildirmek için “sıra bölemezsi-
niz” iletisini gönderiyoruz. bu iletiyi yazmasak da olur. Ama kullanıcıyı
bilgilendirmnek yayrlı olur.
Istisna yönetiminde istisnayı olusturması muhtemel olan deyimi try
bloku içine yazıyoruz. Burada olusan istisna Runtime Exception sınıfının
alt sınıflarından birisi ise, try bloku o istisnayı atacaktır. Atılan istisnayı
catch bloku ile yakalayıp, hatayı giderecek önlemler alınabilir. Bunun için
9. ve 10. satırlar yerine package hata;
c lass Demo {2 s t a t i c i n t a = 12;
s t a t i c i n t b = 0 ;s t a t i c i n t c ;
pub l i c s t a t i c void main( Str ing [ ] args ) {7 System . out . print ln ( "Bu deyim ç a l ı s t ı " ) ;
c = a / b ;System . out . print ln ( "Bu deyim ç a l ı smadı " ) ;
}}
/* *Bu deyim ç a l ı s t ıException in thread "main" java . lang . ArithmeticException : / by zero
4 at hata .Demo. main(Demo. java : 1 3 )
*/
Çıktıta baktıgımızda 7.sattırdaki deyimin çalıstıgını, ama 9.satırdaki
deyim çalısmadan program akısının durdugunu görüyoruz. Program
akısını durduran neden çıktıda görülmektedir. Sistem main metodunda
java.lang.ArithmeticException: / by zero hatası olustugunu
söyleyip akısı kesiyor. Program akısını kesen nedeni bildigimize göre,
program akısını durdurmadaqn, olusan hatayı giderecek bir yöntem
arayabiliriz. Bu yöntem exception handling denilen yöntemdir.
Hatayı yaratması olasıgı olan deyimler try bloku içine, hatayı giderecek
deyimler catch bloku içine yazılır:
Program 1.11.3.
c lass Demo {s t a t i c i n t a = 12;s t a t i c i n t b = 0 ;s t a t i c i n t c ;
5
pub l i c s t a t i c void main( Str ing [ ] args ) {t r y {
c = a / b ;} catch ( ArithmeticException e ) {
10 System . out . print ln ( "Bu deyim ç a l ı s t ı " ) ;c = 0 ;
}System . out . print ln ( c ) ;
}15 }
/* *Bu deyim ç a l ı s t ı0
*/
Çıktıya bakarsak programın son deyimi dahil hepsinin çalıstıgını görebili-
riz. Demek ki yazdıgımız try-catch bloku isteneni yaptı; programın hata
deyiminden sonra kesilmesi önlendi.
Simdi burada bazı kavramları açıklama zamanı gelmistir. Program
(1.11.2) ’de sistem hatanın ne oldugunu söyledi, ve program akısını kesti.
Onun çıktısında verilen java.lang.ArithmeticException: / by zero
iletisi main metodunda ArithmeticException hatasının oldugunu ve
26 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
bu hatanın da sıfıra bölme nedeniyle olustugunu söylüyor. Java’da buna
sistem istisna atıyor (throw) denilir.
Program (1.11.3) ’de ise istisnayı yaratan deyim(ler) try bloku içine
alındı. try belli bir is için kullanılan bloktur. bu blok { } parantezleri ile
sınırlıdır. Ondansonra gelen catch ise bir metottur. Bir blok içindekileri
dısartıdakiler göeremedigine göre, try bloku içinde tanımlanan degisken-
leri catch metodu göremez. Ama bu lokun attıgı exceptionu catch bloku
yakalayabilir.
Bu olusumu java’daki switch-case yapısına benzetebiliriz. Atılan
Try bloku içinde tanımlanan degiskenleri catch metodu göremez. Me-
todun parametresi ArithmeticException ve onun referansı (posin-
ter)ise e’dir. parametre RuntinmeException sınıfının bir alt sınıfı olan
ArithmeticException’dır. Atılan hata budur. Demek ki sitem hatayı
ait oldugı sınıfın adıyla bildiriyor. Atılqn istisnanın referansı e oldyguna
göre cath bloku e yi yakalıyor ve programwkısını kesmeden catch bloku
içindeki deyimleri isliyor ve sonra yoluna devbam ediyor.
Asagıdaki program veri girisinde hata oldugu zaman atılan excep-
tion’u gösteriyor. Bilindigi gibi bilgisara bütün girisler String ile yapılır.
Tamasayı girisleri önce String olarak girer, sonra parseInt() metodu
ile Integer tipe dönüstürülür. Girilen String “123” gibi bir sayıyı gösteren
String ise parseInt() metodu istenen isi yapar. Degilse giris hatası olusur.
Bu durumda NumberFormatException exceptionu atılır. Program (1.11.4)
buna bir örnektir.
Program 1.11.4.
1 // In Source Packet in f i l e except /ex1/Example1 . javac lass Example1 {
pub l i c s t a t i c void main( Str ing [ ] args ) {i n t temperature = 0 ;i f ( args . length > 0) {
6 t r y {temperature = Integer . parseInt ( args [ 0 ] ) ;
}catch ( NumberFormatException e ) {
System . out . print ln (11 "Must enter integer as f i r s t argument . " ) ;
re tu rn ;}
}else {
16 System . out . print ln ("Must enter temperature as f i r s t argument . " ) ;
re tu rn ;}// Create a new coffee cup and set the temperature of
21 // i t s coffee .CoffeeCup cup = new CoffeeCup ( ) ;cup . setTemperature ( temperature ) ;// Create and serve a v i r t u a l customer .VirtualPerson cust = new VirtualPerson ( ) ;
26 VirtualCafe . serveCustomer ( cust , cup ) ;}
}
Bu ve benzeri programlarad e harfi atılan (ve yakalanan) exceptionun
referansıdır (pointer).
Program 1.11.5.
/* *2 *
*/package hata ;
P RO G R A M H ATA L A R I N I AY I K L A M A 27
import java . io . FileNotFoundException ;7
/* ** @author timur
**/
12 c lass Demo {pub l i c s t a t i c void main( Str ing args [ ] ) {
System . out . print ln (myMethod( ) ) ;}
17 pub l i c s t a t i c i n t myMethod( ) {t r y {
re tu rn 112;} f i n a l l y {
System . out . print ln ( "Buras ı F i n a l l y bloktur . " ) ;22 System . out . print ln ( " F i n a l l y blok return deyiminden sonra b i l e ç a l ı s ı r . " ) ;
}}
}
Çoklu excception (multi exception) Java 7 sürümüyle gelmistir. Bir
metot birden çok exception üretirse, onları yakalayacak check metot-
ları yazılabilir. Böylece üretilen exceptionların hepsi bir tek exception
yönetim blokunda yakalanabilir.
Asagıdak programde ikinci catch metodunun parametresi olan IOEx-
ception exception’u try bloku üretmiyor. Java 8 derleme hatası veriyor.
Program 1.11.6.
package except ;
c lass Demo1 {pub l i c s t a t i c void main( Str ing [ ] args ) {
5 i n t x = 100;i n t y = 115;
t r y {i n t i = x / y ;
10 i n t a [ ] = new i n t [ 2 ] ;a [ 3 ] = 112;
} catch ( ArithmeticException e ) {e . printStackTrace ( ) ;
15
} catch ( IOException e ) {e . printStackTrace ( ) ;
} catch ( ArrayIndexOutOfBoundsException e ) {20 e . printStackTrace ( ) ;
/** } f i n a l l y { i f ( reader ! = null ) { t r y { reader . close ( ) ; } catch
( IOException
* ex ) { ex . printStackTrace ( ) ;25 */
}}
}
Program 1.11.7.
2 package except ;
pub l i c c lass MultiplecatchBlocks {
pub l i c s t a t i c void main( Str ing [ ] args ) {7 i n t x = 100;
i n t y = 115;
t r y {i n t i = x / y ;
12 i n t a [ ] = new i n t [ 2 ] ;a [ 3 ] = 112;
} catch ( ArithmeticException e ) {e . printStackTrace ( ) ;
28 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
17 /** } catch ( IOException e ) { e . printStackTrace ( ) ;
*/} catch ( ArrayIndexOutOfBoundsException e ) {
e . printStackTrace ( ) ;22 }
}}
1 /* *java . lang . ArrayIndexOutOfBoundsException : 3
at except . MultiplecatchBlocks . main( MultiplecatchBlocks . java : 1 2 )
*/
Açıklama:
Try blokunda bir bölme islemi ile bir arfray bildirimi var. Bölme
islemi ArithmeticException üretebilir düsüncesiyle 15.satırdaki catch
metodu yax-zııyor. Ama try blokunda aritmetik kurallara ykırı bir durum
dogmadıgı için olası ArithmeticException exception üretilmiyor. 12.satır
iki bilesenli bir array kuruyor. arrayin ögelerinin indisleri yalnızca 0 ve
1 dir. 13.satır olmayan 3 indisli bilesene 112 sayısını atamak istiyor. 3
indisli bilesen olmadıgı için bu deyim ArrayIndexOutOfBoundsException
exception alt sınıfını atıyor. Atılan bu exceptionu birinci catch metodu
yakalamıyor. Ikinci catch metodu yakalıyor.
1.11.1 UnsupportedOperationException
UnsupportedOperationException istisnası istenen islemin mümkün
olmadıgı durumlarda atılır. Asagıdaki metotlar degistirilemez (unmodi-
fiable) koleksiyonlar yaratır. Bu koleksiyonlar degistirilemez.; yani yeni
ögeler eklenemez, emevcutlar depodan atılamaz.
1 pub l i c s t a t i c Collection unmodifiableCollection ( Collection c )
metodu verilen koleksiyondan degistirilemez bir Collection yaratır.
pub l i c s t a t i c Set unmodifiableSet ( Set s )
metodu verilen koleksiyondan degistirilemez bir Set yaratır.
pub l i c s t a t i c SortedSet unmodifiableSortedSet ( SortedSet s )
metodu verilen koleksiyondan degistirilemez bir SortedSet yaratır.
pub l i c s t a t i c L i s t unmodifiableList ( L i s t l i s t )
metodu verilen koleksiyondan degistirilemez bir List yaratır.
Returns an unmodifiable view of the speci f ied SortedMap .
metodu verilen koleksiyondan degistirilemez bir SortedMap yaratır.
Program 1.11.8.
package hata ;
c lass ThrowsDemo {4 s t a t i c void fun ( ) throws I l legalAccessException {
System . out . print ln ( "fun ( ) i çinde " ) ;throw new I l legalAccessException ( "demo" ) ;
}
9 pub l i c s t a t i c void main( Str ing args [ ] ) {t r y {
fun ( ) ;} catch ( I l legalAccessException e ) {
System . out . print ln ( "main i çinde yakaland ı . " ) ;14 }
}}
P RO G R A M H ATA L A R I N I AY I K L A M A 29
/* *fun ( ) i çindemain i çinde yakaland ı .
4 */
Program 1.11.9.
1 package hata ;
pub l i c c lass Printer {p r i va te String ad ;
6 pub l i c void setName( Str ing ad ) {t h i s . ad = ad ;
}
pub l i c void print ( ) {11 p r i n t S t r i n g ( ad ) ;
}
p r i va te void p r i n t S t r i n g ( Str ing s ) {System . out . print ln ( s + " ( " + s . length ( ) + " ) " ) ;
16 }
pub l i c s t a t i c void main( Str ing [ ] args ) {Printer printer = new Printer ( ) ;pr inter . print ( ) ;
21 }}
Exception in thread "main" java . lang . NullPointerExceptionat hata . Printer . p r i n t S tr i n g ( Printer . java : 1 5 )
3 at hata . Printer . print ( Pr inter . java : 1 1 )at hata . Printer . main( Printer . java : 2 0 )
*/
Açıklama:
Programın çıktısı bize programın yazıldıgı yerden hatanın olustugu sa-
tırları gösteriyor. Buna stacktrace deniyor. Ilk hatanın 15.satırda oldugu
görülüyor. Atılan hata NullPointerException istisnası olduguna göre,
15.satırda null pointer kimdir diye bakmalıyız. Debugger kullanarak
s.l eng th() metodundaki s’nin null oldugunu görebiliriz. s.leng th() me-
todunun çalısabilmesi için s nin null olmaması gerekir. Oysa programa
baktıgımızda Pr i nter sınıfının nesnesi yaratılmadıgından, ad temsil
eden s null’dır. ad degiskenini içeren hiç bir nesne olmadıgından 11.satır
ve 20.satırlar çalısamaz.
Program 1.11.10.
package hata ;
import java . u t i l . Collection ;import java . u t i l . Collections ;
5 import java . u t i l . HashSet ;import java . u t i l .Random;
pub l i c c lass UOE {p r i va te f i n a l s t a t i c i n t TOPLAM = 10;
10 p r i va te f i n a l s t a t i c Random random = new Random( ) ;
pub l i c s t a t i c void main( Str ing [ ] args ) {Collection integers = new HashSet (TOPLAM) ;
15 // c o l l e c t i o n ’un elemanlar ı n ı random say ı l a r l a doldur .f o r ( i n t i = 0 ; i < TOPLAM; ++ i )
integers . add (random . nextInt ( ) ) ;
// Deg i s t iri lemeyen c o l l e c t i n ’ in ög e l e r i n i a l .20 Collection unmodifiableCollection =
Collections . unmodifiableCollection ( integers ) ;
// Deg i s t iri lemeyen Collection ’ a eleman ekle . Bu deyim exception atar .unmodifiableCollection . add(random . nextInt ( ) ) ;
}25 }
30 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
/* *java . lang . UnsupportedException
at java . u t i l . Collections$UnmodifiableCollection . add ( c o l l e c t i o n s . java :1055)at UOE. main(UOE. java : 2 2 )
5 */ $
Açıklamalar:
Programın 23.satırı UnsupportedOperationException istisnasını
atar; çünkü deyim, degistirilemeyen koleksiyona yeni öge eklemek istiyor.
Program 1.11.11.
import java . u t i l . Collection ;import java . u t i l . Collections ;
import java . u t i l . HashSet ;5 import java . u t i l .Random;
pub l i c c lass UnsupportedOperationExceptionExampleCollection {p r i va te f i n a l s t a t i c i n t TOTAL_ELEMS = 10;
10 p r i va te f i n a l s t a t i c Random random = new Random( ) ;
pub l i c s t a t i c void main( Str ing [ ] args ) {Collection integers = new HashSet (TOTAL_ELEMS) ;
15 // koleksiyonu ög e l e r i n i random say ı l a r l a doldur .f o r ( i n t i = 0 ; i < TOTAL_ELEMS; ++ i )
integers . add (random . nextInt ( ) ) ;
// Deg i s t iri lemeyen koleksiyonun ög e l e r i n i a l .20 Collection unmodifiableCollection =
Collections . unmodifiableCollection ( integers ) ;
// TDeg i s t iri lemeyen koleksiyona yeni öge ekle . Bu deyim exceptionatar .
25
unmodifiableCollection . add(random . nextInt ( ) ) ;}
}
Exception in thread "main" java . lang . NullPointerException2 at hata . Printer . p r i n t S tr i n g ( Printer . java : 1 5 )
at hata . Printer . print ( Pr inter . java : 1 1 )at hata . Printer . main( Printer . java : 2 0 )
*/
Açıklama:
26.satır exception atar.
1.11.2 ClassCastException
Bu exception bir sınıf baska bir sınıfa dönüstürülmek isteniyor ancak
dönüsüm mümkün degilse olusur. Bu islem ancak sınıf ata sınıfı genisleti-
yorsa ve ogul sınıf ata sınıfa cast ediliyorsa geçerlidir.
Program 1.11.12.
c lass Hayvan {pub l i c void eat ( Str ing s t r ) {
System . out . print ln ( " Eating for grass " ) ;}
5 }c lass Keç i extends Hayvan {
pub l i c void eat ( Str ing s t r ) {System . out . print ln ( "blank " ) ;
}10 }
c lass Another extends Keç i {pub l i c void eat ( Str ing s t r ) {
System . out . print ln ( " another " ) ;15 }
P RO G R A M H ATA L A R I N I AY I K L A M A 31
}
pub l i c c lass Kal ı t ım {pub l i c s t a t i c void main( Str ing [ ] args ) {
20 Hayvan a = new Hayvan ( ) ;Another t5 = ( Another ) new Keç i ( ) ;
}}
/* *2 java . lang . ClasscastException : Keç i cannot be cast to Another
*/
Açıklama:
Another t5= (Another) new Keçi(); deyimi exception atar. Çünkü Keçi
sınıfı kullanılarak Another class nesnesi yaratılamaz.
Program 1.11.13.
package hata ;2
import java . u t i l . ArrayList ;import java . u t i l . I t e r a t o r ;import java . u t i l . L i s t ;
7 pub l i c c lass ClassCastExceptionExample {
pub l i c ClassCastExceptionExample ( ) {
L i s t l i s t = new ArrayList ( ) ;12 l i s t . add( "one" ) ;
// . . . some time l a t e r
I t e r a t o r i t = l i s t . i t e r a t o r ( ) ;17 whi le ( i t . hasNext ( ) ) {
Integer i = ( Integer ) i t . next ( ) ;}
22 }
pub l i c s t a t i c void main( Str ing [ ] args ) {new ClassCastExceptionExample ( ) ;
}
/* *java . lang . classCast Exeption :java . langString cannot be cast to java . lang . Integer
4 */
Açıklama:
12.satırda Arraylist ambarına String tipinden "one" konulmustur.
22.satırda ambardaki bu öge öge Integer tipinden olan i degiskenine
atanmak isteniyor. Teknik olark bu isemin anlamı String tipini Integer
tipe dönüstürmektir ki bu islem olanaksızdır. Dolayısıyla 22.satırda
ClasscastException istisnası atılır.
Simdi, aynı programı, bir metot kullanarak yeniden kodlayalım.
Program 1.11.14.
1 package hata ;
pub l i c c lass Hata02 {
s t a t i c void k e s i r ( ) {6 i n t d = 0 ;
i n t a = 10 / d ;}
pub l i c s t a t i c void main( Str ing args [ ] ) {11 Hata02 . k e s i r ( ) ;
}}
32 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
/*2 Exception in thread "main" java . lang . ArithmeticException : / by zero
at hata . Hata02 . k e s i r ( Hata02 . java : 7 )at hata . Hata02 . main( Hata02 . java : 1 1 )
*
Bu kez de aynı hata olusacak, programın kosması kesilecek ve çıktıda
mesaj gelecektir. Bu mesaj, yukarıdaki mesajın anlamını tasır. Ancak,
programın deyimleri farklı oldugundan, programın yazıldıgı stack’tan
çıkanlar farklıdır:
Bu mesajı söyle yorumlayacagız: main() metodu 11. satırda kesir()
metodunu çagırıyor. Çagrı hata paketindeki Hata02 sınıfının kesir()
metodu içindir. Metot bildiriminin 7.inci satırında ArithmeticException
sınıfının belirledigi divide-by-zero hatası olusuyor.
Yukarıda söyledigimiz gibi program stack’ının bu biçimde hataları
listelemesi, programın düzeltilebilmesi (debug) için çok yararlıdır. Çünkü
hatanın nerede olustugunu görmemizi saglar.
1.12 Exception Türleri
Bütün exception türleri Throwable sınıfının alt sınıflarıdır.22 Throwable adı able ekini aldıgı içinJava’da interface imis gibi yorumlanabilir.Gerçekte Throwable java.langpaketi içindeki bir sınıftır. Bununneden arayüz degil de sınıf oldugunuJava’nın yaratısı James Gosling açıklıyor:[bkz.http://4answered.com/questions/view/-2c1a47/why-is-javalangThrowable-a-class]
Throwable sınıfı Exception ve Error denen iki alt sınıfı vardır. Excep-
tion’ların Throwable sınıfı ya da alt sınıfları tarafından üretilir. Throwable
sınıfı Object sınıfını genisletir. Dolayısıyla onun bütün ögelerine sahiptir.
Error ve Exception adlı alt sınıfları Throwable sınıfını genisletirler. Ex-
ception sınıfı IpoException vetime Eception adlı iki alt sınıf tarafından
genisletilir. bütün java programları java.lang paketini istemsiz (impli-
1.9: Throwable sınıfınınbaslıca alt sınıfları
citly) içerdigi için, Sekil (1.10)’de görülen exception’lar her sınıfta hazır
olarak vardır. Bunlar arasında yönetilmeleri açısından RuntimeException
ve alt sınıflarından gelen istisnalar önem tasır. Sözkonusu alt sınıfları ve
ne olduklarını listelemek yararlı olacaktır:
1.13 RuntimeException alt sınıfları (Unchecked Exception)
Bu istisnalar, kosmayan bir deyim nedeniyle kosma anında olusur. Java
derleyicisi bu hataları göremez; onlar ancak kosma anında ortaya çıkar.
ArithmeticException Aritmetic hata , s ı f ı ra bö l ünme g i b i
P RO G R A M H ATA L A R I N I AY I K L A M A 33
ArrayIndexOutOfBoundsException Dizi i n d i s i s ı n ı r l a r ı n d ı s ı nda .
ArrayStoreException Dizi eleman ı na uyumsuz türde atama .
ClassCastException Geç e r s i z cast .
IllegalArgumentException Metodu ç a l ı s t ı rmak i ç in i l l e g a l argüman.
Il legalMonitorStateException I l l e g a l monitor i s lemi , unlocked bir thread üzerinde bekleme g i b i .
I l l e g a l S t a t e E x c e p t i o n Ortam veya uygulama dogru olmayan durumda .
Il legalThreadStateException I stenen i slem anl ı k thread durumu i l e uyumludeg i l .
NullPointerException Null referans ı n ı n geç e r s i z kullan ımı .
NumberFormatException Bir s t r i n g ’ in say ı s a l formata geç e r s i zdönüsümü .
SecurityException Güvenlik i h l a l i denemesi . .
StringIndexOutOfBounds Bir s t r i ng e s ı n ı r l a r ı d ı s ı nda index verme .
TypeNotPresentException Tip mevcut deg i l . ( J2SE 5 i l e eklendi . )
UnsupportedOperationException Desteklenmeyen i slem kar s ı l a s ı ld ı .
1.10: Throwable sınıfınınbaslıca alt sınıfları
NullPointerExceptionInval id use of a n u l l reference .
NumberFormatExceptionInval id conversion of a s t r i n g to a numeric format .
SecurityExceptionAttempt to v i o l a t e secu ri ty .
StringIndexOutOfBoundsAttempt to index outside the bounds of a s t r i n g .
UnsupportedOperationExceptionAn unsupported operation was encountered
34 J C F : J AVA C O L L E C T I O N S F R A M E W O R K
1.14 Checked Exception’lar
Bu istisnalar RuntimeException ya da onun alt sınıflarına ait olmayan
istisnalardır. Bu istisnalar geçersiz giris, ag baglantısı olmayısı ya da
veritabanı giris-çıkısı yapılamadıgı gibi istisnalardır. Bu istisnalar derleme
anında ortaya çıkar ve akısı hemen keser.ClassNotFoundException S ı n ı f bulunamad ı .
I n s t a nt i a t i o n Exception Abstract bir s ı n ı f veya arayüzde nesne olu sturmag i r i s imi .
I l l e g a l Access Exception S ı n ı fa e r i sim engellendi .
Not Such Method Exception I stenen metot yok .
1.15 Java’da Sık Karsılasılan Hatalar
1.15.1 JDK tarafından Atılan Hatalar
AssertionErrorAWTError ( java . awt )IOError ( java . io )
4 LinkageErrorE x c e p t i o n I n I n i t i a l i z e r E r r o rNoClassDefFoundErrorUnsatisfiedLinkErrorVeri fyError
9 ThreadDeathVirtualMachineError
InternalErrorOutOfMemoryErrorStackOverflowError
14 UnknownError
1.15.2 java.lang paketinde Check Exception’lar
1 ReflectiveOperationException
ClassNotFoundExceptionInstantiationExceptionIl legalAccessException
6 InvocationTargetExceptionNoSuchFieldExceptionNoSuchMethodException
CloneNotSupportedException11 InterruptedException
UnknownError
1.15.3 java.lang paketi içinde Runtime exceptionlar
ArithmeticExceptionIndexOutOfBoundsException
3
ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException
ArrayStoreException8 ClassCastException
EnumConstantNotPresentExceptionIllegalArgumentException
Il legalThreadStateExceptionNumberFormatException
13 I l legalMonitorStateExceptionI l l e g a l S t a t e E x c e p t i o nNegativeArraySizeExceptionNullPointerExceptionSecurityException
18 TypeNotPresentExceptionUnsupportedOperationException
UnknownError
——————————————————
2 Kaynakça