JavaRush /Kurslar /All lectures for UZ purposes /Java dasturlarida istisnolar

Java dasturlarida istisnolar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Istisnolar

Istisnolar Java dasturlarida

Nihoyat, dasturchilar xatoliklarni boshqarish va avtomatlashtirishni tartibga solib olishdi. Bu esa istisnolar ixtiro qilinganda yuz berdi. Hozirda dunyoda istisnolar mexanizmi yordamida 80% favqulodda vaziyatlar boshqariladi.

Agar istisnolarni biror olim ixtiro qilgan bo'lsa, ehtimol, bu bilan doktorlik dissertatsiyasini himoya qilgan. Agar esa dasturchi ixtiro qilgan bo'lsa, balki u hamkasblardan bir oz do'stona yelkalariga do'stona qarsak eshitgan: «G'oyibona, bro».

Java dasturida xatolik sodir bo'lganida, masalan, 0 ga bo'lish, quyidagi ajoyib narsalar sodir bo'ladi:

Birinchi qadam

Maxsus istisno obyekti yaratiladi, unda sodir bo'lgan xatolik haqida ma'lumotlar bor.

Java-da hamma narsa obyektdir, va istisnolar - istisno emas 🙂 Istisno obyektlari o'z sinflariga ega, va ularning oddiy sinflardan farqli tomoni shundaki, ular Throwable sinfidan meros olishgan.

Ikkinchi qadam

Istisno obyekti "otiladi". Juda omadsiz nomlanish. "Istisno otish" asosan yong'in signalizatsiyasini yoqish yoki xavfli ogohlantirish tugmachasini bosishga o'xshaydi.

Tizimga "istilno otganda", dastur normal rejimi to'xtatiladi va "avariya protokoli" bo'yicha ishga tushadi.

Uchinchi qadam

Istisno yuzaga kelgan (otilgan) joriy metod darhol tugatiladi. Istisno chaqirilgan metodga uzatiladi, u ham darhol tugatiladi. Va shunday qilib zanjir bo'ylab, main metodi tugatilguncha. main metodi bilan birga dastur ham tugatiladi.

Misol:

Kod Ekranga chiqarish
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Diqqat! Dunyoning oxiriga tayyorgarlik");
      konetsSveta();
      System.out.println("Dunyoning oxiri muvaffaqiyatli tugadi");
   }

   public static void konetsSveta()
   {
      System.out.println("Muhim bir narsani qilamiz");
      podelim(0);
      System.out.println("Hammasi juda yaxshi ishlamoqda");
   }

   public static void podelim(int n)
   {
      System.out.println("Hech qanday qo'rqinchli narsa emas: " + n);
      System.out.println(2 / n);
      System.out.println("Hech qanday qo'rqinchli narsa yuz bermadi: " + n);
   }
}
Diqqat! Dunyoning oxiriga tayyorgarlik
Muhim bir narsani qilamiz
Hech qanday qo'rqinchli narsa emas: 0

20-qatorida xatolik yuz berdi - 0 ga bo'lish. Java-mashina shu zahoti istisnoni - ArithmeticException klassidagi ob'ektni yaratdi va uni tizimga "otdi".

podelim() metodi darhol tugatildi, shuning uchun ekranga "Hech qanday qo'rqinchli narsa yuz bermadi: 0" satri chiqarilmadi. Dastur konetsSveta() metodiga qaytdi va vaziyat takrorlandi: tizimda istisno mavjud, demak konetsSveta() metodi ham avariyali tugatiladi. Keyin main metodi tugatiladi va dastur bajarilishi to'xtatiladi.

Xo'sh, bunday istisno ishining ma'nosi nimada? Shundaki, dasturda ma'lum turdagi istisnolarni tutib olish va avariya vaziyatlarini boshqarish uchun o'z logikangizni yozish mumkin.


2. Istisnolarni tutib olish try-catch

Java-da istisnolarni tutib olish mexanizmi mavjud, bu metodlarning avariya xavfini to'xtatishga imkon beradi. U quyidagicha ko'rinadi:

try
{
   xato yuzaga kelishi mumkin bo'lgan kod
}
catch(IstisnoTuri ism)
{
   istisnoni boshqarish kodi
}

Bu konstruksiya try-catch bloki deb ataladi.

Xato yuzaga kelishi mumkin bo'lgan kod qavslarga o'raladi, ular oldida try (harakat qilish) so'zi yoziladi.

Qavslardan keyin catch kalit so'zi yoziladi, doira qavslarida istisno turi tipidagi o'zgaruvchini e'lon qilish kerak. Keyin qavslar keladi, agar ko'rsatilgan turdagi istisno yuzaga kelsa, bajarilishi kerak bo'lgan kod yoziladi.

Agar "asosiy kod" ishida istisnolar yuzaga kelmasa, catch blokidagi kod bajarilmaydi. Agar istisno yuzaga kelsa, (agar hosil bo'lgan istisno turi doira qavslaridagi o'zgaruvchi turi bilan mos keladi.)

Misol:

Kod Ekranga chiqarish
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Adron Kollayder ishga tushirildi");

      try
      {
         zapustitAdronnuyuKollayder(1);
         zapustitAdronnuyuKollayder(0);
      }
      catch(Exception e)
      {
         System.out.println("Xatolik! Istisno tutib olindi");
         System.out.println("Sayyorani qora tuynuk yutib yubordi!");
      }

      System.out.println("Adron Kollayder to'xtatildi");
   }

   public static void zapustitAdronnuyuKollayder(int n)
   {
      System.out.println("Hammasi juda yaxshi ishlamoqda: " + n);
      System.out.println(2/n);
      System.out.println("Hech qanday muammo yo'q: " + n);
   }
}
Adron Kollayder ishga tushirildi
Hammasi juda yaxshi ishlamoqda: 1
2
Hech qanday muammo yo'q: 1
Hammasi juda yaxshi ishlamoqda: 0
Xatolik! Istisno tutib olindi
Sayyorani qora tuynuk yutib yubordi!
Adron Kollayder to'xtatildi


3. Bir necha catch bloklari

Bir necha catch bloklari

Tez-tez kod bloklari ichida har xil istisnolar yuzaga kelishi mumkin. Ba'zilarini bir usulda boshqarishni xohlaysiz, boshqalarini esa boshqa usulda, uchinchilarning esa umuman boshqarmoqchisiz.

Java dasturchilari sizga yordam berishni qaror qilishdi va try blokidan keyin bir emas, balki bir nechta catch bloklarini yozishga ruxsat berishdi.

try
{
   xato yuzaga kelishi mumkin bo'lgan kod
}
catch(IstisnoTuri1 ism1)
{
   istisno1 boshqarish kodi
}
catch(IstisnoTuri2 ism2)
{
   istisno2 boshqarish kodi
}
   catch(IstisnoTuri3 ism3)
{
   istisno3 boshqarish kodi
}

Misol:

Kod Ekranga chiqarish
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("main metodining boshlanishi");
      try
      {
         hisobla(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("0 ga bo'lish bo'ldi");
      }
      catch(Exception e)
      {
         System.out.println("Biror istisno tutib olindi");
      }

      System.out.println("main metodining oxiri");
   }

   public static void hisobla(int n)
   {
      System.out.println("hisobla boshlanishi: " + n);
      System.out.println(2/n);
      System.out.println("hisobla oxiri: " + n);
   }
}
main metodining boshlanishi
hisobla boshlanishi: 0
0 ga bo'lish bo'ldi
main metodining oxiri


4. catch bloklarining tartibi

try blokida yuzaga kelgan istisno faqat bitta catch blok tomonidan tutib olinishi mumkin. Bunday vaziyat bo'lishi mumkin emas, istisno boshqarishda bir nechta catch blokidagi kod bajarilishi.

Lekin bloklarning tartibi ahamiyatlidir.

Biror istisno bir nechta bloklar tomonidan tutib olinishi mumkin bo'lgan vaziyat yuzaga kelishi mumkin. Bu holda u catch blok amalga oshiriladi, u try blokiga yaqinroq turadi.

Bunday vaziyat qanday yuzaga kelishi mumkin, bitta istisno bir nechta catch bloklari tomonidan tutib olinishi mumkin.

Barcha istisnolar meros olish orqali yagona ierarxiyaga birlashtirilgan - sxemaga qarang.

Java istisnolarning ierarxiyasi

ArithmeticException tipidagi istisno obyekti ArithmeticException tipidagi o'zgaruvchiga tayinlanishi mumkin, shuningdek uning ota-sinf o'zgaruvchilariga: RuntimeException, Exception va Throwable - sxemaga qarang.

Meros olish va ota-sinflar haqida biz 21-darajada gaplashamiz.

Ushbu kod juda yaxshi kompilyatsiya qilinadi:

Meros olishning afzalliklari:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

Shuning uchun ArithmeticException turidagi istisnoni catch bloklari tomonidan tutib olish mumkin.

Misol 1:

Kod Ekranga chiqarish
class Solution
{    public static void main(String[] args)
   {
      System.out.println("main metodining boshlanishi");
      try
      {
         hisobla(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("0 ga bo'lish bo'ldi");
      }
      catch(Exception e)
      {
         System.out.println("Biror istisno tutib olindi");
      }

      System.out.println("main metodining oxiri");
   }

   public static void hisobla(int n)
   {
      System.out.println("hisobla boshlanishi: " + n);
      System.out.println(2/n);
      System.out.println("hisobla oxiri: " + n);
   }
}
main metodining boshlanishi
hisobla boshlanishi: 0
0 ga bo'lish bo'ldi
main metodining oxiri

Ushbu misolda ArithmeticException istisnoni catch(Exception e) bloki yoki catch(ArithmeticException e) bloki tomonidan tutib olish mumkin. U try blokiga yaqinroq joylashgan birinchi catch blok tomonidan tutib olinadi.

Hech qanday kutilmagan holatlar bo'lmasligi uchun catch bloklari, deyarli barcha istisnolarni tutib olishga qodir bloklarni catch bloklar ro'yxatining oxiriga yaqinroq joylashtirish yaxshiroq.

Throwable turi umuman Java-da barcha mumkin bo'lgan istisnolarni tutib olish qobiliyatiga ega, agar u birinchi catch blokiga joylashtirilsa - kod kompilyatsiya qilinmaydi, chunki kompilyator kodda erishib bo'lmaydigan kod bloklari mavjudligini tushunadi.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION