1. İstisnalar
Nəhayət ki, proqramçılar səhvlərin emalını tənzimləmək və avtomatlaşdırmaq barədə düşündülər. Bu, istisnalar icad edildikdə baş verdi. İndi istisnalar mexanizmi ilə dünyada fövqəladə halların 80%-i idarə olunur.
Əgər istisnaları hansısa alim icad edibsə, çox güman ki, o, bu barədə doktorluq dissertasiyası müdafiə edib. Əgər proqramçı bunu icad edibsə, bəlkə də həmkarlarından dostcasına bir çiyinə vurmadan başqa bir şey almayıb: «Elə bil normaldır, bro».
Java proqramında bir səhv meydana gəldikdə, məsələn, 0
-a bölünmə, belə gözəl şeylər baş verir:
Birinci addım
Səhv haqqında məlumat daşıyan xüsusi bir obyekt-istisna yaradılır.
Java-da hər şey obyekt olduğu kimi, istisnalar da istisna deyil 🙂 Obyekt-istisnaların öz sinifləri var və onların adi siniflərdən fərqi ondan ibarətdir ki, onlar Throwable
sinifindən miras alınıblar.
İkinci addım
Obyekt-istisna «atılır». Ad çox da uğurlu deyil. «İstisna atılması» mahiyyəti etibarilə daha çox yanğın siqnalizasiyasının və ya «həyəcan siqnalının» verilməsinə bənzəyir.
Sistemdə «istisna atıldıqda», proqramın normal iş rejimi dayandırılır və «fövqəladə vəziyyət protokolu» işə düşür.
Üçüncü addım
İstisnanın meydana gəldiyi (atıldığı) cari metod dərhal başa çatır. İstisna çağıran metoda ötürülür, o da dərhal başa çatır. Bu zəncirin sonuna qədər davam edir, main
metodu bitənədək. main
metodunun başa çatması ilə proqram da dayandırılır.
Nümunə:
Kod | Ekrandakı nəticə |
---|---|
|
|
20-ci sətirdə bir səhv baş verdi — 0-a bölünmə. Java virtual maşını dərhal istisna yaratdı — ArithmeticException
sinfinin bir obyektini və onu sistemə «atdı».
podelim()
metodu dərhal başa çatdı, buna görə də ekranda Heç bir ciddi şey baş vermədi: 0 sətiri çıxmadı. Proqram konetsSvet()
metoduna qayıtdı, və vəziyyət təkrarlanır: sistemdə istisna var, bu o deməkdir ki, konetsSvet()
metodu da fövqəladə şəkildə başa çatır. Sonra main
metodu başa çatır və proqramın icrası dayandırılır.
Bəs belə istisnaların mahiyyəti nədir? Məsələ ondadır ki, proqramınızda müəyyən növ istisnaları tutmaq və fövqəladə halların emalı üçün öz loqinizi yazmaq mümkündür.
2. İstisnaların tutulması try-catch
Java-da istisnaların tutulması üçün bir mexanizm mövcuddur ki, bu da metodların qəza ilə bitməsinin qarşısını alır. Görünüşü belədir:
try
{
xəta yarana biləcək kod
}
catch(İstisnaTipi ad)
{
istisnanın idarə olunma kodu
}
Bu struktur try-catch
bloku adlanır.
İstisnaların yarana biləcəyi kod əyri mötərizələr arasına yazılır, onun qarşısında isə try
(cəhd etmək) sözü yazılır.
Əyri mötərizələrdən sonra catch
açar sözü yazılır, dairəvi mötərizələr içində istisna tipi dəyişəni elan olunur. Daha sonra əyri mötərizələr gəlir, bu mötərizələr arasında həmin tipdəki istisnalar yaranarsa icra olunması lazım olan kod yazılır.
Əgər icra zamanı «əsas kod»da istisna yaranmazsa, catch blokundakı kod icra olunmayacaq. Əgər istisna yaranarsa və istisnanın tipi dairəvi mötərizələrdəki tip ilə eynidirsə, icra olunacaq.
Nümunə:
Kod | Ekrana çıxış |
---|---|
|
|
3. Bir neçə catch
bloku
Nəzəri olaraq, kod blokunun içində müxtəlif istisnalar baş verə bilər. Bəzilərini bir üsulla idarə etmək istəyəcəksiniz, digərlərini isə başqa cür, üçüncüləri isə ümumiyyətlə idarə etmək istəməyəcəksiniz.
Java tərtibatçıları sizin işinizi asanlaşdırmağa qərar verdilər və try
blokundan sonra bir deyil, bir neçə catch
bloku yazmağa icazə verdilər.
try
{
səhv baş verə biləcək kod
}
catch(İstisnaNövü1 ad1)
{
istisna1 üçün idarəetmə kodu
}
catch(İstisnaNövü2 ad2)
{
istisna2 üçün idarəetmə kodu
}
catch(İstisnaNövü3 ad3)
{
istisna3 üçün idarəetmə kodu
}
Nümunə:
Kod | Ekrana çıxış |
---|---|
|
|
4. catch
bloklarının ardıcıllığı
try
blokunda yaranan istisna yalnız bir catch
bloku tərəfindən tutula bilər. Elə bir vəziyyət ola bilməz ki, istisnanın emalı zamanı bir neçə catch
blokunun kodu işlənsin.
Lakin blokların ardıcıllığı önəmlidir.
Elə bir vəziyyət ola bilər ki, istisna bir neçə blok tərəfindən tutula bilər. Belə halda o, ilk (yəni try
blokuna daha yaxın olan) catch
bloku tərəfindən tutular.
Necə bir vəziyyət ola bilər ki, bir istisnanı bir neçə catch
bloku tuta bilsin?
Bütün istisnalar irsilik vasitəsilə vahid iyerarxiyada birləşdirilib — bax şəkil.
ArithmeticException
tipli istisna obyekti təkcə ArithmeticException
tipində olan dəyişənə deyil, həm də onun sinif-atalarının dəyişənlərinə:
RuntimeException
, Exception
və Throwable
- bax şəkil.
İrsilik və sinif-ataları haqqında daha ətraflı 21-ci səviyyədə danışacağıq.
Bu kod mükəmməl şəkildə kompilyasiya olunacaq:
Irsiliyin üstünlükləri: |
---|
|
Buna görə də ArithmeticException
tipli istisnanı yuxarıda göstərilən 4 tipin hər hansı biri ilə catch
blokları ilə tuta bilərsiniz.
Nümunə 1:
Kod | Ekrana çıxış |
---|---|
|
|
Bu nümunədə ArithmeticException
istisnası həm catch(Exception e)
blokunda, həm də catch(ArithmeticException e)
blokunda tutula bilər. O, try
blokuna daha yaxın yerləşən birinci catch
bloku tərəfindən tutulacaq.
Gözlənilməz vəziyyətlərdən qaçmaq üçün yaxşısı budur ki, demək olar ki, bütün istisnaları tuta bilən catch
blokları siyahısının sonuna daha yaxın yerləşdirilsin.
Throwable
tipi ümumiyyətlə Java-da mümkün olan bütün istisnaları tuta bilir, əgər onu ilk catch
blokuna yerləşdirsək - kod kompilyasiya olunmaz, çünki kompilyator kodda əlçatmaz blokların olduğunu anlayır.
GO TO FULL VERSION