JavaRush /Java blogi /Random-UZ /Istisnolar: belgilangan, belgilanmagan va o'zingizniki

Istisnolar: belgilangan, belgilanmagan va o'zingizniki

Guruhda nashr etilgan
Salom! Oxirgi ma'ruzada biz Java tilining istisno sifatidagi tomoni bilan tanishdik va ular bilan ishlash misollarini ko'rdik. Bugun biz ularning tuzilishini chuqurroq ko'rib chiqamiz, shuningdek, o'z istisnolarimizni qanday yozishni o'rganamiz :)

Istisno turlari

Aytganimizdek, Java-da juda ko'p istisno sinflari mavjud, deyarli 400! Ammo ularning barchasi guruhlarga bo'lingan, shuning uchun ularni eslab qolish juda oson. Bu shunday ko'rinadi: Istisnolar: belgilangan, belgilanmagan va o'zingizniki - 2Barcha istisnolar umumiy ajdodlar sinfiga ega Throwable. Undan ikkita katta guruh keladi - istisnolar (istisno) va xatolar (xato). Xato Java virtual mashinasining ishlashi bilan bog'liq bo'lgan dasturni bajarishdagi muhim xatodir. Ko'pgina hollarda, Xatoni hal qilish kerak emas, chunki u koddagi ba'zi jiddiy kamchiliklarni ko'rsatadi. Eng mashhur xatolar: StackOverflowError- masalan, metod cheksiz ravishda o'zini chaqirganda va OutOfMemoryError- yangi ob'ektlarni yaratish uchun xotira etarli bo'lmaganda paydo bo'ladi. Ko'rib turganingizdek, bunday holatlarda ko'pincha ishlov berish uchun maxsus narsa yo'q - kod shunchaki noto'g'ri yozilgan va uni qayta ishlash kerak. Istisnolar , aslida, istisnolar: dastur ishlayotgan paytda yuzaga kelgan istisno, rejalashtirilmagan vaziyat. Bular Xato kabi jiddiy xatolar emas, lekin ular bizning e'tiborimizni talab qiladi. Barcha istisnolar 2 turga bo'linadi - tekshirilgan ( belgilangan ) va belgilanmagan ( belgilanmagan ). Istisnolar: belgilangan, belgilanmagan va o'zingizniki - 3Barcha tekshirilgan istisnolar Exception. "Tasdiqlanishi mumkin" nimani anglatadi? Biz oxirgi ma'ruzada bu haqda qisman aytib o'tdik : "...Java kompilyatori eng keng tarqalgan istisnolar haqida biladi va ular qanday vaziyatlarda yuzaga kelishi mumkinligini biladi." Misol uchun, u biladiki, agar dasturchi fayldan ma'lumotlarni kodda o'qisa, fayl mavjud bo'lmagan vaziyat osongina paydo bo'lishi mumkin. Va u oldindan bashorat qila oladigan bunday vaziyatlar juda ko'p. Shuning uchun kompilyator bizning kodimizni potentsial istisnolar uchun oldindan tekshiradi. Agar u ularni topsa, biz ularni qayta ishlamagunimizcha yoki ularni yuqoriga uzatmagunimizcha kodni kompilyatsiya qilmaydi. Istisnoning ikkinchi turi "belgilanmagan". Ular sinfdan kelishadi RuntimeException. Ular sinovdan o'tganlardan qanday farq qiladi? Ko'rinishidan, RuntimeExceptionmuayyan ish vaqti istisnolaridan kelib chiqqan va tavsiflovchi bir qancha turli sinflar ham mavjud. Farqi shundaki, kompilyator bu xatolarni kutmaydi. U shunday deb aytayotganga o'xshaydi: “Kodni yozish paytida men shubhali hech narsa topmadim, lekin u ishlayotganda nimadir noto'g'ri ketdi. Kodda xatolar bor shekilli!” Va haqiqatan ham shunday. Tekshirilmagan istisnolar ko'pincha dasturchi xatolarining natijasidir. Va kompilyator odamlar o'z qo'llari bilan yaratishi mumkin bo'lgan barcha mumkin bo'lgan noto'g'ri vaziyatlarni ta'minlay olmaydi :) Shuning uchun u bizning kodimizda bunday istisnolarning ishlashini tekshirmaydi. Siz allaqachon bir nechta belgilanmagan istisnolarga duch kelgansiz:
  • ArithmeticExceptionnolga bo'linganda sodir bo'ladi
  • ArrayIndexOutOfBoundsExceptionMassivdan tashqaridagi hujayraga kirishga harakat qilganda paydo bo'ladi.
Nazariy jihatdan, albatta, Java yaratuvchilari bunday istisnolardan majburiy ishlov berishni joriy qilishlari mumkin edi, ammo keyin kod qanday bo'ladi? Raqamlarni bo'lishning har qanday operatsiyasi bilan siz tasodifan nolga bo'linayotganingizni tekshirish uchun try-catch yozishingiz kerak bo'ladimi? Massivga kirishda siz ushbu chegaralardan chiqib ketganingizni tekshirish uchun try-catch yozishingiz kerak bo'ladi. Yozilgan har qanday kod spagetti bo'ladi va butunlay o'qib bo'lmaydi. Bu fikrdan voz kechish mantiqan to'g'ri. Shuning uchun, tekshirilmagan istisnolarni try-catch bloklarida ko'rib chiqish yoki tepaga tashlash kerak emas, garchi bu Xatoda bo'lgani kabi texnik jihatdan mumkin.

Istisnoni qanday tashlash kerak

Albatta, Java yaratuvchilari dasturlarda yuzaga kelishi mumkin bo'lgan barcha istisno vaziyatlarni ta'minlay olmaydilar. Dunyoda juda ko'p dasturlar mavjud va ular juda boshqacha. Lekin bu yaxshi, chunki agar kerak bo'lsa, o'zingizning istisnolaringizni yaratishingiz mumkin. Bu juda oson amalga oshiriladi. Siz qilishingiz kerak bo'lgan yagona narsa - o'z sinfingizni yaratish. Uning nomi "istisno" bilan tugashi kerak. Kompilyatorga bu kerak emas, lekin kodingizni o'qiyotgan dasturchilar bu istisno sinf ekanligini darhol tushunadilar. Bundan tashqari, siz sinf sinfdan kelganligini ko'rsatishingiz kerak Exception. Bu kompilyator va to'g'ri ishlash uchun allaqachon zarur. Masalan, bizda Dog sinfi bor - Dog. yordamida it bilan yurishimiz mumkin walk(). Ammo bundan oldin, bizning uy hayvonimiz yoqa, tasma va tumshuq kiyganligini tekshirishimiz kerak. Agar ulardan birortasi etishmayotgan bo'lsa, biz o'zimizdan istisno qilamiz DogIsNotReadyException. Uning kodi quyidagicha ko'rinadi:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Sinf istisno ekanligini ko'rsatish uchun sinf nomidan keyin Exception kengaytmasini yozishingiz kerak : bu "sinf Exception sinfidan olingan" degan ma'noni anglatadi. Konstruktorda biz shunchaki sinf konstruktorini Exceptionchiziq bilan chaqiramiz message- u foydalanuvchiga tizimdan sodir bo'lgan xatoni tavsiflovchi xabarni ko'rsatadi. Bu bizning sinf kodimizda shunday ko'rinadi:
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
Endi bizning usulimiz walk()istisno qiladi DogIsNotReadyException. Bu kalit so'z yordamida amalga oshiriladi throw. Yuqorida aytib o'tganimizdek, istisno - bu ob'ekt. Shuning uchun, bizning usulimizda, istisno vaziyat yuzaga kelganda - itga biror narsa etishmayapti - biz yangi sinf ob'ektini yaratamiz DogIsNotReadyExceptionva so'z yordamida dasturga tashlaymiz throw. Usul imzosiga walk()otishlarni qo'shamiz DogIsNotReadyException. Boshqacha qilib aytganda, kompilyator endi usul chaqiruvi walk()istisnoga olib kelishi mumkinligini biladi. Shunday qilib, biz buni dasturning biron bir joyiga chaqirganimizda, istisnoni ko'rib chiqish kerak bo'ladi. Keling, buni usulda qilishga harakat qilaylik main():
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Kompilyatsiya qilmaydi, istisno ko'rib chiqilmaydi! try-catchIstisnoni hal qilish uchun kodimizni blokga aylantiramiz :
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
Endi konsol chiqishini ko'rib chiqamiz:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Konsol chiqishi qanchalik ma'lumotli bo'lganiga qarang! Biz dasturda sodir bo'lgan har bir qadamni ko'ramiz; Biz xatolik qayerda sodir bo'lganini ko'ramiz va itimizga aynan nima etishmayotganini darhol payqab qo'yamiz :) Shunday qilib biz o'z istisnolarimizni yaratamiz. Ko'rib turganingizdek, hech qanday murakkab narsa yo'q. Va Java ishlab chiquvchilari noto'g'ri jihozlangan itlar uchun o'z tillariga alohida istisno qo'shishdan bezovta qilmasalar ham, biz ularning nazoratini tuzatdik :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION