Istisnolar turlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Istisnolar turlari

Java'dagi istisnolar turlari

Barcha istisnolar 4 turga bo'linadi, ular aslida bir-biridan meros bo'lgan sinflardir.

Throwable sinfi

Barcha istisnolar uchun eng asosiy sinf Throwable sinfidir. Throwable sinfida hozirgi stack trace chaqiruvlarini massivga yozadigan kod joylashgan. Stack trace nima ekanligini biroz keyinroq o'rganamiz.

throw operatoriga faqat Throwable ning merosxo'r sinfidan ob'ektni uzatilishi mumkin. Va garchi nazariy jihatdan throw new Throwable(); kodini yozish mumkin — bu odatda hech kim qilmaydi. Throwable sinfi mavjudligining asosiy maqsadi — barcha istisnolar uchun yagona ota sinf bo'lishdir.

Error sinfi

Keyingi istisno sinfi Error sinfidir — Throwable sinfining to'g'ridan-to'g'ri merosxo'ri. Java mashinasi jiddiy muammo yuzaga kelganda Error turidagi ob'ektlarni (va uning merosxo'r sinflarini) yaratadi. Masalan, ishlashdagi nosozlik, xotira yetishmovchiligi va hokazo.

Odatda, agar dasturda Error tipidagi xato yuzaga kelsa, siz dasturchi sifatida hech narsa qila olmaysiz: bu juda jiddiy xato hisoblanadi. Siz faqat foydalanuvchini dasturning favqulodda tugashi haqida xabardor qilishingiz yoki xato haqidagi barcha ma'lumotlarni dastur jurnaliga yozishingiz mumkin.

Exception sinfi

Exception (va RuntimeException) turidagi istisnolar — bu ko'plab metodlar ishlashi jarayonida yuzaga kelgan odatiy xatolardir. Har bir tashlangan istisnoni maqsadi — ushbu holatda nima qilish kerakligini biladigan catch blok tomonidan ushlab olinishi.

Agar biror metod biron sabab tufayli ishini bajara olmasa, darhol chaqiruvchi metodni xabardor qilishi kerak, tegishli turdagi istisnoni tashlash orqali.

Boshqacha aytganda, agar biror o'zgaruvchi null ga teng bo'lsa, metod NullPointerExceptionni tashlaydi, agar metodga noto'g'ri argumentlar kiritilgan bo'lsa — InvalidArgumentExceptionni tashlaydi, agar metodda tasodifan nolga bo'linish sodir bo'lgan bo'lsa — ArithmeticExceptionni tashlaydi.

RuntimeException sinfi

RuntimeException — bu Exception istisnolarining bir turidir (kichik to'plami). Hatto shunday deyish mumkin, RuntimeException — bu odatdagi istisnolar (Exception)ning yengil versiyasi: bunday istisno uchun kamroq talablar va cheklovlar mavjud.

Siz Exception va RuntimeException farqini keyinroq bilib olasiz.


2. Tekshiriladigan istisnolar: throws, checked exceptions

Tekshiriladigan istisnolar: throws, checked exceptions

Barcha Java istisnolari 2 toifaga bo'linadi — tekshiriladigan (checked) va tekshirilmaydigan (unchecked).

RuntimeException va Error sinflaridan meros bo'lgan barcha istisnolar unchecked-istisnolar hisoblanadi, boshqalari — checked-istisnolar.

Muhim!

Tekshiriladigan istisnolarni kiritganidan beri 20 yil o'tgach, deyarli barcha Java dasturchilar bu xato deb hisoblaydilar. Hozirgi zamonaviy mashhur freymlarklardagi barcha istisnolarining 95% — tekshirilmaydigan. C# tili ham, deyarli Java'dan nusxa ko'chirilgan bo'lsa-da, checked-istisnolar qo'shmagan.

Aslida checked-istisnolarni uncheckeddan qanday farqlanishi?

Checked-istisnolarga qo'shimcha talablar mavjud. Ular taxminan shunday eshitiladi.

Talab 1

Agar metod checked-istisnoni tashlasa, uning sarlavhasida (metod imzosida) ushbu istisno turini ko'rsatishi kerak. Shunday qilib, ushbu metodni chaqiradigan barcha metodlar, unda shunday "muhim istisno" yuzaga kelishi mumkinligini biladi.

checked-istisnolarni metod parametrlaridan keyin throws kalit so'zidan keyin ko'rsatish kerak (bu throw bilan aralashmaslik kerak). Bu taxminan shunday ko'rinishda bo'ladi:

tur metod (parametrlar) throws istisno

Misol:

checked-istisno unchecked-istisno
public void calculate(int n) throws Exception
{
   if (n == 0)
      throw new Exception("n nolga teng!");
}
public void calculate(n)
{    if (n == 0)
      throw new RuntimeException("n nolga teng!");
}

O'ng tarafdagi misolda bizning kod unchecked-istisnoni tashlaydi — qo'shimcha harakatlar talab qilinmaydi. Chap tarafdagi misolda metod checked-istisnoni tashlaydi, shuning uchun metodning imzosiga throws kalit so'zi va istisno turini qo'shdik.

Agar metod bir nechta checked-istisnolarni tashlashni rejalashtirayotgan bo'lsa, ularning barchasini throwsdan keyin vergul orqali ko'rsatish kerak. Tartibi ahamiyatli emas. Misol:

public void calculate(int n) throws Exception, IOException
{
   if (n == 0)
      throw new Exception("n nolga teng!");
   if (n == 1)
      throw new IOException("n birga teng");
}

Talab 2

Agar siz checked-istisnolar ko'rsatilgan metodni chaqirsangiz, unda bu faktni e'tiborsiz qoldira olmaysiz.

Siz barcha istisnolarni ushlashingiz kerak, ularni catch bloklarni har biriga qo'shib, yoki o'zingizning metodingizga throws orqali qo'shishingiz kerak.

Biz o'zimizga shunday deymiz: bu istisnolar juda muhim, biz ularni albatta ushlab olishimiz kerak. Agar biz qanday qilib ularni ushlashni bilmasak, biz metodimizni chaqiruvchilarga bu istisnolar yuzaga kelishi mumkinligini bildirishimiz kerak.

Misol:

Tasavvur qiling, biz odamlar bilan yashaydigan dunyo yaratadigan metodni yozmoqdamiz. Boshlang'ich odamlar soni parametr sifatida uzatiladi. Shunda biz juda kam odam bo'lsa, istisnolarni qo'shishimiz kerak bo'ladi.

Yer yaratish Eslatma
public void yangiDunyoYaratish(int n) throws Bo'shDunyo,Yolg'izDunyo
{
   if (n == 0)
      throw new Bo'shDunyo("Hech qanday odam yo'q!");
   if (n == 1)
      throw new Yolg'izDunyo("Juda kam odam!");
   System.out.println("Ajoyib dunyo yaratildi. Aholi soni: " + n);
}
Metod potentsial ravishda ikki checked-istisnoni tashlaydi:

  • Bo'shDunyo
  • Yolg'izDunyo

Ushbu metod chaqirilishi uch xil usulda amalga oshirilishi mumkin:

1. Yuzaga keladigan istisnolarni ushlamaymiz

Ko'pincha bu metodda bu holatni to'g'ri boshqarish qandayligini bilmasak, amalga oshiriladi.

Kod Eslatma
public void aholiYangiDunyoYaratish(int population)
throws Bo'shDunyo, Yolg'izDunyo
{
   yangiDunyoYaratish(population);
}
Chaqiruvchi metod istisnolarni ushlamaydi va ularning borligini boshqalarga xabardor qilishga majbur: o'ziga throws qo'shadi

2. Ba'zi istisnolarni ushlash

Pochta ma'lum xatolarni boshqaramiz, nomalumlarini esa chaqiruvchi metodga uzatamiz. Buning uchun throws ga ularning nomini qo'shish kerak:

Kod Eslatma
public void bo'shDunyoYaratish(int population)
throws Bo'shDunyo
{
   try
   {
      yangiDunyoYaratish(population);
   }
   catch (Yolg'izDunyo e)
   {
      e.printStackTrace();
   }
}
Chaqiruvchi metod bitta checked-istisnoni – Yolg'izDunyoni ushlaydi, ikkinchisini o'z imzosiga qo'shishi kerak: throws so'zidan keyin ko'rsatish kerak

3. Barcha istisnolarni ushlash

Agar metod chaqiruvchi metodga istisnolarni uzatmasa, chaqiruvchi metod har doim hammasi yaxshi bajarilganiga ishonadi. Va hech qanday chora ko'rmaydi, holatni tuzatish uchun.

Kod Eslatma
public void harQandayDunyoYaratish(int population)
{
   try
   {
      yangiDunyoYaratish(population);
   }
   catch(Yolg'izDunyo e)
   {
      e.printStackTrace();
   }
   catch(Bo'shDunyo e)
   {
      e.printStackTrace();
   }
}
Bu metodda barcha xatolar ushlanadi. Chaqiruvchi metod har doim hamma narsa a'lo bajarganiga ishonadi.


3. Bir necha istisnolarni ushlash

Dasturchilar kodning dublikatidan juda yomon ko'rishadi. Hatto shunday ishlab chiqish prinsipini o'ylab topdilar — DRY: Don’t Repeat Yourself. Lekin istisnolarni boshqarishda ko'pincha try bloklaridan keyin bir xil kodli bir nechta catch bloklar paydo bo'ladi.

Yoki masalan, bitta kodli 3 ta catch-blok va boshqa kodli yana 2 ta catch-blok bo'lishi mumkin. Loyihangizda istisnolarni boshqarishga mas'uliyatli yondashish mavjud bo'lsa, bu standart vaziyatdir.

Java tilining 7-versiyasidan boshlab, bir nechta istisno turlarini bitta catch blokda ko'rsatish imkoniyati qo'shildi. Bu taxminan shunday ko'rinishda bo'ladi:

try
{
   xato yuzaga kelishi mumkin bo'lgan kod
}
catch(IstisnoTuri1 | IstisnoTuri2 | IstisnoTuri3 nomi)
{
   istisnolarni boshqarish kodi
}

catch bloklari qancha bo'lishi mumkin. Lekin bitta catch blokda bir-biridan meros oladigan istisnolarni ko'rsatish mumkin emas. Ya'ni, catch (Exception | RuntimeException e) yozish mumkin emas, chunki RuntimeException sinfi Exception dan meros bo'lgan.



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