CodeGym /Kurslar /Java SELF AZ /Java-proqramlarda İstisnalar

Java-proqramlarda İstisnalar

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. İstisnalar

Java Proqramlarında İ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ə
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Diqqət! Dünyanın sonuna hazırlıq");
      konetsSvet();
      System.out.println("Dünya sonu uğurla tamamlandı");
   }

   public static void konetsSvet()
   {
      System.out.println("Vacib bir şey edirik");
      podelim(0);
      System.out.println("Hər şey mükəmməl işləyir");
   }

   public static void podelim(int n)
   {
      System.out.println("Heç bir ciddi şey baş verməyəcək: " + n);
      System.out.println(2 / n);
      System.out.println("Heç bir ciddi şey baş vermədi: " + n);
   }
}
Diqqət! Dünyanın sonuna hazırlıq
Vacib bir şey edirik
Heç bir ciddi şey baş verməyəcək: 0

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ış
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Hadron Kollayder işə salındı");

      try
      {
         işəSalHadronKollayder(1);
         işəSalHadronKollayder(0);
      }
      catch(Exception e)
      {
         System.out.println("Xəta! İstisna tutuldu");
         System.out.println("Planet qara dəliyə çəkildi!");
      }

      System.out.println("Hadron Kollayder dayandırıldı");
   }

   public static void işəSalHadronKollayder(int n)
   {
      System.out.println("Hər şey yaxşı işləyir: " + n);
      System.out.println(2/n);
      System.out.println("Heç bir problem yoxdur: " + n);
   }
}
Hadron Kollayder işə salındı
Hər şey yaxşı işləyir: 1
2
Heç bir problem yoxdur: 1
Hər şey yaxşı işləyir: 0
Xəta! İstisna tutuldu
Planet qara dəliyə çəkildi!
Hadron Kollayder dayandırıldı


3. Bir neçə catch bloku

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ış
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("main metodunun başlanğıcı");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("0-a bölmə oldu");
      }
      catch(Exception e)
      {
         System.out.println("Hər hansı bir istisna tutuldu");
      }

      System.out.println("main metodunun sonu");
   }

   public static void calculate(int n)
   {
      System.out.println("calculate başlanğıcı: " + n);
      System.out.println(2/n);
      System.out.println("calculate sonu: " + n);
   }
}
main metodunun başlanğıcı
calculate başlanğıcı: 0
0-a bölmə oldu
main metodunun sonu


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.

Java İstisnalar İyerarxiyası

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, ExceptionThrowable - 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:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

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ış
class Solution
{    public static void main(String[] args)
   {
      System.out.println("main metodunun başlanğıcı");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("0-a bölmə baş verdi");
      }
      catch(Exception e)
      {
         System.out.println("Hər hansı bir istisna tutuldu");
      }

      System.out.println("main metodunun sonu");
   }

   public static void calculate(int n)
   {
      System.out.println("calculate başlanğıcı: " + n);
      System.out.println(2/n);
      System.out.println("calculate sonu: " + n);
   }
}
main metodunun başlanğıcı
calculate başlanğıcı: 0
0-a bölmə baş verdi
main metodunun sonu

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.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION