jcf: java collections frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · program hatalarini...

35
Kısım I Exceptions (istisnalar)

Upload: others

Post on 27-Mar-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

Kısım I

Exceptions (istisnalar)

Page 2: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**
Page 3: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 4: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 " ) ;

Page 5: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

*/

Page 6: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 7: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 8: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 9: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

*/

Page 10: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 ;

Page 11: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 12: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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:

Page 13: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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;

Page 14: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 15: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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ü

Page 16: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 17: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

*/

Page 18: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 }}

Page 19: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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ı {

Page 20: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 21: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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.

Page 22: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 23: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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”)

Page 24: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 25: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 26: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 ;

Page 27: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 ( ) ;

Page 28: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 }

}}

Page 29: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 }

Page 30: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 }

Page 31: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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 ( ) ;

}}

Page 32: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 33: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

Page 34: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

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

——————————————————

Page 35: JCF: Java Collections Frameworktkaracay/etudio/ders/prg/... · 2018. 2. 19. · PROGRAM HATALARINI AYIKLAMA 5 10} System . out . println ( "Programakıs¸ıdevamediyor" ) ;}} /**

2 Kaynakça