1. Istisnolar

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 |
|---|---|
|
|
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 |
|---|---|
|
|
3. 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 |
|---|---|
|
|
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.

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: |
|---|
|
Shuning uchun ArithmeticException turidagi istisnoni catch bloklari tomonidan tutib olish mumkin.
Misol 1:
| Kod | Ekranga chiqarish |
|---|---|
|
|
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.
GO TO FULL VERSION