JavaRush /Java blogi /Random-UZ /Java tilidagi istisnolar
Roman
Daraja

Java tilidagi istisnolar

Guruhda nashr etilgan
"Istisnolar" mavzusiga duch kelganimda, bularning barchasi qanday ishlashini batafsil tushunish uchun Internetning turli burchaklaridan javob izlashim kerak bo'lgan ko'plab savollar tug'ildi. Natijada, men o'z tushuntirishimni tuzdim, bu hodisaga endi duch kelgan yangi boshlanuvchilar uchun tushunarli bo'lishi mumkin. Java-da istisnolar - 1Kompyuterlarda uzilish protsessorga zudlik bilan javob berishni talab qiladigan voqea sodir bo'layotganligi haqidagi kiruvchi signaldir. To'xtash signali protsessordan ishlayotgan dasturni biroz keyinroq davom ettirish uchun to'xtatib turishini talab qiladi, ya'ni kompyuter dasturning bajarilishi bilan bog'liq barcha ma'lumotlarni eslab qolishi kerak. Bunday uzilishlar vaqtinchalik, agar halokatli bo'lmasa. Bunday uzilishlar dastur kodi yoki ba'zi bir apparat funktsiyalari (masalan, klaviaturadagi tugmachalarni bosish; taymerlar, masalan, kompyuterni avtomatik ravishda o'chirish) tufayli yuzaga kelishi mumkin. Uzilishlar soni ma'lum bir protsessor ishlab chiqarishga o'rnatilgan ma'lum son bilan cheklangan, ya'ni buning uchun maxsus aloqa "kanallari" ajratilgan, bu sizga boshqa barcha jarayonlarni chetlab o'tib protsessorga kirishga imkon beradi. Bajarilayotgan dastur kodida xatolik yuzaga kelganda ham uzilishlar avtomatik ravishda hosil bo'ladi (masalan, nolga bo'linish sodir bo'lsa). Bunday uzilishlar an'anaviy ravishda tuzoq yoki istisno deb ataladi . Bunday hollarda: "Istisno tashlandi" deyish odatiy holdir, ya'ni Istisno ishga tushirildi yoki Istisno tashlandi (tashlandi), ya'ni uzilish uchun so'rov."nima qilish kerak?" degan savol bilan. protsessorga yuboriladi. Ayni paytda protsessor o'zi to'xtagan nuqtani, aniqrog'i ma'lumot bajarilishi kerak bo'lgan keyingi hujayraning klasterini eslab, ishlashni to'xtatadi. Bajarilgan va bajarilmagan ko'rsatmalarning butun zanjiri esga olinadi. Shundan so'ng, protsessor bunday xatolik yuzaga kelganda harakat qilish uchun xotiradan ko'rsatmalarni o'qiydi. Ushbu ko'rsatmaga muvofiq, u ma'lum klasterlarga yangi qiymatlarni kiritishi, ba'zi harakatlar zanjirlarini yoki yangi tsiklni (masalan, qaytish yoki aylanish tsikli) va hokazolarni qo'shishi mumkin, ya'ni ilgari qo'yilgan xatoga qarab. pastga yo'naltirilgan ko'rsatmalar bajariladi. Kompyuter tizimining o'zida ko'plab avtomatik uzilishlar o'rnatilgan bo'lib, ular ma'lum vaqtdan keyin ishga tushiriladi, masalan, kompyuterda ishlaydigan jarayonlarni boshqarish yoki o'rnatilgan signallarni ishga tushirish, kiruvchi tashqi signallarni yig'ish va turli xil ma'lumotlarni o'zgartirish uchun. Shuni esda tutish kerakki, ko'p sonli uzilishlar bir qator sabablarga ko'ra tizimni butunlay "osib qo'yishi" mumkin. Dastur kodidagi xatolik avtomatik ravishda protsessorda uzilishga olib keladi va u belgilangan ko'rsatmalarga muvofiq qayta ishlashga harakat qiladi. Lekin hamma uzilishlar ularni boshqarish uchun mo'ljallanmagan yoki u bizga mos kelmaydigan protsedura ishlab chiqishi mumkin, masalan, u shunchaki dasturni buzadi. Shuning uchun, dasturlashda dasturchi xatolik ehtimolini ko'radigan kodning ma'lum bir qismi uchun o'zingizning uzilishingizni tashkil qilishingiz mumkin. Bunday holda, xato dastur ichida qayta ishlanadi va ko'rsatmalarni qayta ishlash uchun protsessor bilan bog'lanmaydi. Bunday bloklarning ta'rifi "Istisno" ob'ektini yaratish orqali tashkil etiladi . Ushbu ob'ekt avtomatik ravishda blokda yaratiladi try-catch. Blok >tryxato mavjudligi uchun tekshiriladi va agar mavjud bo'lsa, dastur blokga o'tadi catch, bu erda xatoning oldini olish yoki uni tekislash uchun harakatlar amalga oshiriladi. Misol uchun, agar biz klaviaturadan Raqamlarni kiritsak , keyinchalik qo'shilishi va ayirilishi kerak bo'lsa, klaviaturadan Harflarni kiritish ularni Raqamlar bilan qo'shishni imkonsiz qiladi (bu ikki o'zgaruvchining yig'indisini S harfi bilan belgilaymiz). Shuning uchun, jamoa sifatida trybiz Raqamlarni o'z ichiga olgan A raqamini harflarni o'z ichiga olgan B raqamiga (ya'ni S = A + B) qo'shish mumkinligini tekshirishimiz kerak va agar bu mumkin bo'lmasa va bu mumkin bo'lmasa, unda aniq Xatolar sodir bo'lmadi va "nima qilish kerak?" Degan yangi uzilish protsessorga uchib ketmasligi uchun choralar ko'rish kerak. Agar dasturda Istisno bo'lmasa, uning bajarilishi protsessor tomonidan to'xtatiladi. Agar Istisno mavjud bo'lsa, u buyruq bilan "ushlanganda" tryboshqaruv buyruqqa o'tadi catch, bu muqobil echimni o'rnatishi mumkin, masalan, biz bu ikki raqamni qo'shmaymiz, lekin S = A o'rnatamiz.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* qatori “int r = 1;” bajarilmaydi, chunki xatolik yuz berdi va dastur ishni to'g'ridan-to'g'ri istisno ishlovchisiga yo'naltiradi (catch block*/ Shunday qilib, Istisnolarning mavjudligi muammoni protsessor darajasiga tashlamasdan dastur ichida hal qilish imkoniyatidir. Xato aniqlanganda blokda avtomatik ravishda yaratiladigan "Istisno" ob'ekti tryxato turining qiymatini o'z ichiga oladi. Keling, buni "Bizning istisnomiz" deb ataymiz - o'ziga xos xatomiz tavsifi bilan bizning aniq holatimiz uchun. Java tilini yaratuvchilar oldindan odatiy xatolar ro'yxatini va ularni tuzatish uchun odatiy variantlarni yaratdilar, ya'ni java'da ma'lum bir istisnolar kutubxonasi mavjud bo'lib , biz yuzaga kelgan xatoni hal qilish uchun murojaat qilishimiz mumkin. ishlov berish kodini o'zimiz yozmasligimiz kerak va shuning uchun OurException allaqachon kimdir tasvirlangan bo'lishi mumkin, shuning uchun biz ushbu istisnolardan qaysi biri nosozlik yuzaga kelishi mumkin bo'lgan kodni boshqarish uchun dasturimizga kiritish kerakligini bilishimiz kerak. Agar biz xatoga yo'l qo'ysak va kutubxonadan noto'g'ri Istisno tanlasak , u holda ishlov beruvchi uni "ushlamaydi", xato dastur ichida yechim topa olmaydi va so'rov protsessorga yuboriladi. Ammo dangasa uchun yo'l bor. Agar kutubxonadan bizga kerak bo'lgan istisnoning nomini bilmasak, yuqorida tavsiflangan misolda bo'lgani kabi, " Istisno " nomi bilan umumiy nomni olishimiz mumkin. Ushbu Istisno har qanday turdagi xatolarni bartaraf etishga qodir, lekin u biz qayd etishimiz mumkin bo'lgan voqea haqida aniq ma'lumot bera olmaydi. Oldin yozilgan Istisnolar kutubxonasi belgilangan va belgilanmagan Istisnolardan iborat . Tekshirish mumkin bo'lganlar - bu dasturning ishini to'xtatmasdan tuzatilishi mumkin bo'lganlar, ya'ni faylni u mavjud bo'lmagan papkada ochishga harakat qilsak, tizim bu haqda bizga xabar beradi, biz faylni tashlab yuborishimiz mumkin. kerakli papkaga kiring va dasturni davom ettiring. Ya'ni, aslida, protsessorga uzilish uchun so'rov yuborildi , ammo savolsiz: "bu muammo bilan nima qilishni qidiring?!?!" Biz o'zimiz aniqlagan Interruptni tayyor ko'rsatma bilan yubordik, protsessor uni qayta ishladi va dasturni bajarishni davom ettirdi. Tekshirilmagan - tuzatib bo'lmaydigan xatolar va dastur tugashidan oldin yopiladi, ya'ni protsessorga uzilish so'rovi yuboriladi., bu har qanday holatda dasturning bajarilishini to'xtatadi. Dasturda bunday istisnolarni yozishning yagona nuqtasi foydalanuvchiga nima bo'lganini tushunishga imkon berishdir, chunki bu uzilishni ushlaganimizdan so'ng, biz ekranda dastur ishdan chiqqanligi sababli ma'lumot xabarini ko'rsatishimiz mumkin. Bunday uzilishlarni qo'lga olishning ikkinchi sababi - ularni keyingi tahlil qilish uchun jurnallarga yozib olish qobiliyati (siz buzilgan, lekin hech bo'lmaganda qaerdaligini bilasiz). Bunday kutubxonalarning mavjudligi oqibati ularni o'z ichiga olishni unutmaslikdir. (Kutubxonalar bilan belgilangan va belgilanmagan Istisnolar roʻyxatini, masalan, bu yerda topish mumkin ) Agar qaysi kutubxonaga kiritishni aniq bilmasak yoki bir nechta xato variantlari mavjud boʻlsa, biz catchkerakli Istisnolarni bir nechtasida sanab oʻtishimiz mumkin. Agar ro'yxatda bo'lsa, tizimning o'zi to'g'ri ishlov beruvchini tanlaydi. Muayyan Istisno o'rniga , agar oldingi bloklarda qayta ishlanmagan bo'lsa, har qanday turdagi Istisnolarni boshqarishi mumkin bo'lgan umumiy " Istisno " ni yozishingiz mumkin .
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Agar blok mavjud bo'lsa, tryIstisno avtomatik ravishda yaratiladi. Vaqtning bir nuqtasida Istisnoni majburlashimiz kerak bo'lsa , u holda buyruq ishlatiladi throw. Ya'ni, biz mustaqil ravishda ob'ekt yaratamiz new throw... shundan so'ng dastur o'z ishini to'xtatadi, protsessorga uzilish so'rovini yuboradi va dastur bo'limiga o'tkaziladi catch, u erdan keyingi harakatlar uchun ko'rsatmalar olishga harakat qiladi. Istisnoni qo'lda yaratish orqali biz kutubxonadan uning o'ziga xos turini belgilashimiz mumkin:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
catchkeyin ishlov beruvchi ushbu maxsus Istisno bilan blokni qidiradi - dastur bo'ylab, har tomondan qidirish catch. Istisnolarni qayta ishlash buyrug'idan so'ng throw, blokda bo'lganidan tashqari, qolgan barcha dastur kodi bajarilmaydi catch. Agar dasturda ishlov beruvchi topilmasa, protsessorga savol beriladi: "nima qilishni o'zingiz hal qiling" va u dasturni to'xtatadi. Qo'ng'iroq ... blokning new throwichida ham, tashqarisida ham amalga oshirilishi mumkin (dasturning istalgan joyida)>try
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Istisnolar haqida xabar berish

Ilgari kimdir tomonidan yozilgan usullar istisnolarni tashlashni o'z ichiga olishi mumkin. Faqat xavfsiz tomonda bo'lish uchun kodni yozgan dasturchi keyingi dasturchilarni u yozgan usulda xatolik yuz berishi mumkinligi haqida ogohlantirdi. Shunday qilib, masalan, quyida tavsiflangan fayl yaratish usuli faylni yaratishda xatolik yuzaga kelishi mumkinligini ko'rsatadi (berilgan yo'lda fayl yo'q), ya'ni xato ishlov beruvchisi kerak bo'ladi:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Ammo shu bilan birga, ishlov beruvchining o'zi ham yo'q, demak, endi biz oddiy rejimda dasturimizdagi yozma usulni oddiygina chaqira olmaymiz. Endi biz xato ishlov beruvchini yozishimiz va ushbu usulni blokda chaqirishimiz kerak try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Mahalliy istisnolar

Mavjud kutubxonalar biz uchun etarli bo'lmasa, ba'zi xatolarni hal qilish uchun o'zingizning istisnolaringizni yozishingiz mumkin. Buning uchun biz shunchaki Exception sinfidan meros bo'lgan sinfni yaratamiz
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
O'zingizning istisnolaringizni yaratishda ikkita qoidani yodda tutishingiz kerak:
  1. Sinfimiz nomi "istisno" bilan tugashi kerak
  2. Sinfda Istisno muammosining tafsilotlarini tavsiflovchi qator o'zgaruvchisi bo'lgan konstruktor bo'lishi kerak. Konstruktorda super konstruktor chaqiriladi va xabar uzatiladi.
Yaratilgan istisnodan foydalanishga misol:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Biz ushbu istisnoni kod bilan ushlaymiz:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Dasturni bajarish natijasi quyidagicha bo'ladi: StudentNotFoundException: ID 0000001 bo'lgan talabani topib bo'lmadi.

Nima uchun Istisnolarni yozishingiz kerak?

1996 yilda Ariane 5 raketasi float o'zgaruvchisini butun o'zgaruvchiga noto'g'ri konvertatsiya qilish tufayli halokatga uchradi. Bu holat uchun istisnolar yoki ishlovchilar yo'q edi. Agar faylni yuklab olayotganda Internetga ulanish uzilib qolsa, unda Istisno mavjudligi ulanish tiklangandan keyin yuklab olishni davom ettirish imkonini beradi. Istisno bo'lmasa, yuklab olish qayta boshlanishi kerak bo'ladi.

Adabiyotlar:

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