JavaRush /Java blogi /Random-UZ /Java-da istisnolar (Java istisnolari)

Java-da istisnolar (Java istisnolari)

Guruhda nashr etilgan
Kundalik hayotda ba'zida biz rejalashtirmagan vaziyatlar yuzaga keladi. Misol uchun, siz ertalab ishga turasiz, telefoningiz uchun zaryadlovchini qidirasiz, lekin u yo'q. Yuzingizni yuvish uchun hojatxonaga borasiz - suv o'chirilgan. Men mashinaga o'tirdim va u boshlanmadi. Ammo odam bunday kutilmagan vaziyatlarni juda oson engishga qodir. Ushbu maqolada Java dasturlari ular bilan qanday munosabatda bo'lishini aniqlashga harakat qilamiz.

Istisnolar java

Dasturlash olamida dasturni bajarish jarayonida xatolik va kutilmagan vaziyatlarning yuzaga kelishi istisno deyiladi. Dasturda istisnolar foydalanuvchining noto'g'ri harakatlari, diskda kerakli resurs yo'qligi yoki tarmoq orqali serverga ulanishning yo'qolishi natijasida yuzaga kelishi mumkin. Dasturni bajarish paytidagi istisnolar, shuningdek, dasturlash xatolari yoki API dan noto'g'ri foydalanish natijasida yuzaga kelishi mumkin. Bizning dunyomizdan farqli o'laroq, dastur bunday vaziyatda nima qilish kerakligini aniq bilishi kerak. Java bu maqsad uchun istisno mexanizmini taqdim etadi.

Kalit so'zlar haqida qisqacha try, catch, finally, throws

Java-da istisnolardan foydalanish dasturda quyidagi kalit so'zlardan foydalanishga asoslangan:
  • try - istisno sodir bo'lishi mumkin bo'lgan kod blokini belgilaydi;
  • catch - istisno ishlanadigan kod blokini belgilaydi;
  • nihoyat - ixtiyoriy kod blokini belgilaydi, lekin agar mavjud bo'lsa, sinab ko'rish blokining natijalaridan qat'i nazar, baribir bajariladi.
Ushbu kalit so'zlar dastur kodida maxsus qayta ishlash konstruksiyalarini yaratish uchun ishlatiladi: try{}catch, try{}catch{}nihoyat, try{}nihoyat{}.
  • otish - istisno qilish uchun ishlatiladi;
  • throws - usulning istisno qilishi mumkinligi haqida ogohlantirish uchun usul imzolarida ishlatiladi.
Java dasturida kalit so'zlardan foydalanishga misol:
//method reads a string from the keyboard

public String input() throws MyException {//warn with throws,
// that the method can throw MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// in the try block we enclose the code in which an exception can occur, in this
// if the compiler tells us that the readLine() method of the class
// BufferedReader may throw an I/O exception
    try {
        s = reader.readLine();
// in the catch block we enclose the code for handling the IOException exception
    } catch (IOException e) {
        System.out.println(e.getMessage());
// close the read stream in the finally block
    } finally {
// when closing the stream, an exception is also possible, for example, if it was not opened, so we “wrap” the code in a try block
        try {
            reader.close();
// write exception handling when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// we decided that an empty string could disrupt the work of our program in the future, for example, on the result of this method, we need to call the substring(1,2) method, so we are forced to interrupt the program execution with the generation of our exception type MyException using throw
        throw new MyException("String can not be empty!");
    }
    return s;
}

Nima uchun bizga istisno mexanizmi kerak?

Keling, haqiqiy dunyo misolini ko'rib chiqaylik. Tasavvur qiling-a, avtomagistralda yuk ko'tarish qobiliyati cheklangan favqulodda ko'prikli qism bor. Massasi ko‘prikning yuk ko‘tarish qobiliyatidan oshib ketadigan transport vositasi uning ustidan o‘tsa, u qulab tushishi va haydovchining ahvoli yumshoq qilib aytganda, favqulodda holatga aylanishi mumkin. Buning oldini olish uchun yo'l xizmati yo'lda oldindan ogohlantiruvchi belgilarni o'rnatadi. Mashinaning haydovchisi ogohlantirish belgisiga qarab, mashinasining og'irligini ko'prikda haydashga ruxsat berilgan og'irlik bilan solishtiradi. Agar undan oshib ketsa, u aylanma yo'lni oladi. Yo‘l xizmati xodimlarining harakatlari tufayli yuk mashinalari haydovchilariga, birinchidan, marshrutini oldindan o‘zgartirish imkoniyati berildi, ikkinchidan, asosiy yo‘nalishdagi xavf haqida ogohlantirildi va nihoyat, ulardan foydalanish mumkin emasligi haqida ogohlantirildi. ma'lum sharoitlarda ko'prik.
Исключения в Java - 2
Dasturdagi istisnolarning oldini olish va uni davom ettirish uchun uni hal qilish qobiliyati Java-da istisnolardan foydalanishning sabablaridan biridir. Istisno mexanizmi, shuningdek, kiruvchi ma'lumotlarni tekshirish (tekshirish) orqali siz yozgan kodni (dasturlash interfeysi) foydalanuvchi tomonidan noto'g'ri foydalanishdan himoya qilish imkonini beradi. Keling, bir soniya yo'l politsiyasi bo'laylik. Birinchidan, siz haydovchilar muammoga duch kelishi mumkin bo'lgan joylarni bilishingiz kerak. Ikkinchidan, siz ogohlantirish belgilarini tayyorlashingiz va o'rnatishingiz kerak. Nihoyat, asosiy yo'lda xavf tug'ilganda aylanma yo'llarni ta'minlash kerak. Java-da istisno mexanizmi xuddi shunday ishlaydi. Dasturni ishlab chiqish bosqichida biz try{} bloki yordamida kodning xavfli bo'limlarini istisnolardan "himoya qilamiz", catch{} bloki yordamida "zaxira" yo'llarini ta'minlaymiz va nihoyat{} blokida biz bajariladigan kodni yozamiz. har qanday natija uchun dastur. "Favqulodda marshrutni" taqdim eta olmagan yoki ataylab tanlovni foydalanuvchiga qoldirmoqchi bo'lgan hollarda, biz hech bo'lmaganda uni xavf haqida ogohlantirishimiz kerak. Nega? Yo'lda bitta ogohlantirish belgisiga duch kelmasdan o'tib bo'lmaydigan favqulodda ko'prikka etib kelgan haydovchining g'azabini tasavvur qiling! Dasturlashda, darslarimiz va usullarimizni yozishda, biz har doim ham boshqa ishlab chiquvchilar tomonidan ularning dasturlarida foydalanish kontekstini oldindan ko'ra olmaymiz, shuning uchun biz istisnoli vaziyatni hal qilishning 100% to'g'ri yo'lini oldindan ko'ra olmaymiz. Shu bilan birga, bizning kodimiz foydalanuvchilarini istisno qilish ehtimoli haqida ogohlantirish yaxshi amaliyotdir. Java-ning istisno mexanizmi buni bizga throws yordamida amalga oshirishga imkon beradi - asosan istisnoni tashlash uchun usulimizning umumiy xatti-harakatini e'lon qiladi va shu bilan Java-da istisno bilan ishlash uchun kod yozishni usul foydalanuvchisiga qoldiradi.

"Muammo" haqida ogohlantirish

Agar siz o'zingizning usulingizda istisnoni ko'rib chiqishni rejalashtirmasangiz, lekin foydalanuvchilarni mumkin bo'lgan istisno holatlari haqida ogohlantirmoqchi bo'lsangiz, throws kalit so'zidan foydalaning. Usul imzosidagi ushbu kalit so'z muayyan sharoitlarda usul istisno qilishi mumkinligini anglatadi. Ushbu ogohlantirish usul interfeysining bir qismi bo'lib, foydalanuvchiga istisno ishlov beruvchisini amalga oshirishni sozlash huquqini beradi. Otishdan keyin biz tashlanayotgan istisno turini ko'rsatamiz. Bular odatda Java Exception sinfining avlodlaridir . Java ob'ektga yo'naltirilgan til bo'lganligi sababli, Java-dagi barcha istisnolar ob'ektlardir.
Исключения в Java - 3

Java istisno ierarxiyasi

Dasturni bajarishda xatolik yuzaga kelganda, JVM ish vaqti Java istisnolar ierarxiyasidan kerakli turdagi ob'ektni yaratadi - umumiy "ajdod" dan meros bo'lib o'tgan mumkin bo'lgan istisnolar to'plami - Throwable sinf. Dasturda yuzaga keladigan istisno holatlarni ikki guruhga bo'lish mumkin:
  1. Dasturning keyingi normal ishlashini tiklash mumkin bo'lmagan holatlar
  2. Qayta tiklash mumkin.
Birinchi guruh Xato sinfidan meros bo'lib qolgan istisnolar yuzaga kelgan vaziyatlarni o'z ichiga oladi . Bu JVM ishlamay qolishi, xotiraning to'lib ketishi yoki tizimning ishdan chiqishi natijasida dasturni bajarish jarayonida yuzaga keladigan xatolar. Ular odatda dasturiy ta'minot yordamida tuzatib bo'lmaydigan jiddiy muammolarni ko'rsatadi. Java-da bu turdagi istisnolar kompilyatsiya bosqichida belgilanmagan deb tasniflanadi. Bu guruhga RuntimeException ham kiradi - istisnolar, Istisno sinfining merosxo'rlari , dasturni bajarish paytida JVM tomonidan yaratilgan. Ular ko'pincha dasturlash xatolaridan kelib chiqadi. Ushbu istisnolar kompilyatsiya vaqtida ham belgilanmagan, shuning uchun ularni qayta ishlash uchun kod yozish shart emas. Ikkinchi guruhga dasturni yozish bosqichida ko'zda tutilgan va qayta ishlash kodi yozilishi kerak bo'lgan istisno holatlar kiradi. Bunday istisnolar tekshiriladi. Istisnolarni hal qilishda Java dasturchisi ishining asosiy qismi bunday vaziyatlarni hal qilishdir.

Istisno yaratish

Dasturni bajarish vaqtida istisno JVM tomonidan yoki throw iborasi yordamida qo'lda chiqariladi . Bu xotirada istisno ob'ektini yaratadi va asosiy dastur kodining bajarilishini to'xtatadi, JVM istisno ishlovchisi istisnoni hal qilish yo'lini topishga harakat qiladi.

Istisno bilan ishlash

Java-da biz istisnolardan foydalanishni ta'minlovchi kod bloklarini yaratish dasturda try{}catch, try{}catch{}nihoyat, try{}finally{} konstruksiyalari yordamida amalga oshiriladi.
Исключения в Java - 4
Sinab ko'rish blokida istisno paydo bo'lganda, istisno ishlovchisi quyidagi catch blokida qidiriladi. Agar tutqich ushbu turdagi istisno uchun ishlov beruvchini o'z ichiga olsa, boshqaruv unga o'tadi. Agar shunday bo'lmasa, JVM mos keluvchi topilmaguncha, usul chaqiruvlari zanjirida ushbu istisno turi uchun ishlov beruvchini qidiradi. Catch bloki bajarilgandan so'ng, boshqaruv ixtiyoriy finally blokiga o'tkaziladi . Tegishli catch bloki topilmasa, JVM dasturning bajarilishini to'xtatadi va agar mavjud bo'lsa, final blok kodini oldindan bajargan holda, usul chaqiruvlari to'plamini ko'rsatadi - stack trace . Istisnolardan foydalanish misoli:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside method print: " + s);
    }

    public static void main(String[] args) {
        Print print = new Print();
        List list= Arrays.asList("first step", null, "second step");

        for (String s:list) {
            try {
                print.print(s);
            }
            catch (NullPointerException e) {
                System.out.println(e.getMessage());
                System.out.println("Exception was processed. Program continues");
            }
            finally {
                System.out.println("Inside bloсk finally");
            }
            System.out.println("Go program....");
            System.out.println("-----------------");
        }

    }
    }
Asosiy usulning natijalari :
Inside method print: first step
Inside bloсk finally
Go program....
-----------------
Exception: s is null!
Exception was processed. Program continues
Inside bloсk finally
Go program....
-----------------
Inside method print: second step
Inside bloсk finally
Go program....
-----------------
Blok finallyodatda try blokida ochilgan oqimlarni yopish yoki resurslarni bo'shatish uchun ishlatiladi. Biroq, dastur yozishda barcha resurslarning yopilishini kuzatib borish har doim ham mumkin emas. Hayotimizni osonlashtirish uchun Java dasturchilari bizga try-with-resourcessinash blokida ochilgan resurslarni avtomatik ravishda yopadigan konstruksiyani taklif qilishdi. Bizning birinchi misolimizni quyidagicha qayta yozish mumkin try-with-resources:
public String input() throws MyException {
    String s = null;
    try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
        s = reader.readLine();
   } catch (IOException e) {
       System.out.println(e.getMessage());
   }
    if (s.equals("")){
        throw new MyException ("String can not be empty!");
    }
    return s;
}
7-versiyadan boshlab Java imkoniyatlari tufayli biz har xil turdagi istisnolarni ushlashni bitta blokda birlashtirib, kodni yanada ixcham va o'qilishi mumkin qilishimiz mumkin. Masalan:
public String input() {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        s = reader.readLine();
        if (s.equals("")) {
            throw new MyException("String can not be empty!");
        }
    } catch (IOException | MyException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

Natijalar

Java-da istisnolardan foydalanish bizga "zaxira" yo'llarini qo'llash orqali dasturning xatolarga chidamliligini oshirishga, catch bloklari yordamida asosiy kod mantiqini istisnolarni qayta ishlash kodidan ajratishga imkon beradi, shuningdek, bizga vakolat berish imkoniyatini beradi. throws yordamida kodimiz foydalanuvchisiga istisnolardan foydalanish.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION