Istisno - bu dasturni bajarish paytida, ya'ni ishga tushirish vaqtida sodir bo'ladigan, dastur ko'rsatmalarining normal oqimini buzadigan kiruvchi yoki kutilmagan hodisa. Istisnolarni ko'rib chiqish - bu xatoliklarni bartaraf etish va dasturimizni to'xtatib qo'yishi mumkin bo'lgan ish vaqtining ishdan chiqishini oldini olishimiz mumkin bo'lgan texnikadir.
Ikki turdagi istisnolar mavjud:
- Tekshirilgan istisno - odatda usullarga o'rnatiladigan va kompilyatsiya vaqtida tekshiriladigan istisnolar, masalan, IOException, FileNotFoundException va boshqalar.
- Tekshirilmagan istisno - odatda mantiqiy xatolar tufayli yuzaga keladigan va ish vaqtida tekshiriladigan istisnolar, masalan NullPointerException, ArrayIndexOutOfBoundException va boshqalar.
Kotlin istisnolari
Kotlinda bizda faqat tekshirilmagan istisnolar mavjud va ularni faqat ish vaqtida qo'lga olish mumkin. Barcha istisno sinflar Throwable sinfining avlodlaridir. Biz odatda istisno obyektini tashlash uchun throw ifodasidan foydalanamiz:
throw Exception("Meni tashla")
Umumiy istisnolardan ba'zilari:
- NullPointerException: u null obyektda xususiyat yoki usulni chaqirishga harakat qilganda tashlanadi.
- Arifmetik istisno: raqamlar ustida noto'g'ri arifmetik amallar bajarilganda tashlanadi. masalan - nolga bo'linadi.
- SecurityException: Bu xavfsizlik buzilishini ko'rsatish uchun tashlanadi.
- ArrayIndexOutOfBoundException: U massivning noto'g'ri indeks qiymatiga kirishga harakat qilganda tashlanadi.
Arifmetik istisnolarni tashlash uchun Kotlin dasturi:
fun main(args : Array<String>){
var num = 10 / 0 // nolga bo'lish mumkin emas xatolik beradi.
println(num)
}
Yuqoridagi dasturda biz num o'zgaruvchini 10/0 qiymati bilan ishga tushiramiz, lekin biz bilamizki, arifmetikada nolga bo'linishga ruxsat berilmaydi. Biz dasturni ishga tushirishga harakat qilayotganimizda, u istisno qiladi. Ushbu muammoni hal qilish uchun try-catch blokidan foydalanishimiz kerak.
Kotlin try-catch bloki
Kotlinda biz dasturda istisnolardan foydalanish uchun try-catch blokidan foydalanamiz. Try bloki istisnoni tashlash uchun javobgar bo'lgan kodni o'z ichiga oladi va catch bloki istisno bilan ishlash uchun ishlatiladi. Bu blok asosiy yoki boshqa usullar ichida yozilishi kerak. Sinab ko'ring blokdan keyin catch bloki yoki nihoyat blok yoki ikkalasi ham kelishi kerak.
try-catch bloki sintaksisi:
try {
// istisnolarni keltirib chiqarish
} catch(e: ExceptionName) {
// istisnolarni ishlash
}
try-catch bloki yordamida arifmetik istisnolarni qayta ishlash uchun Kotlin dasturi:
import kotlin.ArithmeticException
fun main(args : Array<String>){
try{
var num = 10 / 0
}
catch(e: ArithmeticException){
println("Nolga bo'lish mumkin emas.")
}
}
Izoh: Yuqoridagi dasturda biz try-catch blokidan foydalanganmiz. Istisnoni tashlashi mumkin bo'lgan num o'zgaruvchi try blokining qavslari ichiga olingan, chunki nolga bo'linish arifmetikada aniqlanmagan. Istisno catch bloki tomonidan ushlanib, println() bayonotni bajaring.
Kotlin try-catch blokini ifoda sifatida
Biz allaqachon bilganimizdek, ifoda har doim qiymatni qaytaradi. Biz dasturimizda ifoda sifatida kotlin try-catch blokidan foydalanishimiz mumkin. Ifoda tomonidan qaytarilgan qiymat try blokining oxirgi ifodasi yoki catch blokining oxirgi ifodasi bo'ladi. Agar kodda istisno bo'lsa, catch bloki qiymatni qaytaradi.
Try-catchni ifoda sifatida ishlatish uchun Kotlin dasturi:
fun test(a: Int, b: Int) : Any {
return try {
a/b
}
catch(e:Exception){
println(e)
"Nolga bo'lish mumkin emas."
}
}
fun main(args: Array<String>) {
var result1 = test(10,2 )
println(result1)
var result = test(10,0 )
println(result)
}
Yuqoridagi kodda biz ifoda sifatida try-catch dan foydalandik. Dasturning yuqori qismida funktsiya testini e'lon qiling va u try-catch bloki yordamida qiymatni qaytaradi. Biz test funktsiyani asosiy usuldan chaqirdik va parametr qiymatlarini o'tkazdik (10,2) Test funksiyasi argumentlarni baholaydi va sinab ko'rish qiymatini qaytaradi (10/2 = 5). Ammo keyingi qo'ng'iroqda biz (b=0) o'tdik va bu safar istisno ushlanib, catch blokining ifodasini qaytaradi.
Kotlin finally bloki
Kotlinda, finally blok har doim, istisnolar catch bloki tomonidan boshqariladimi yoki yo'qmi, qat'iy nazar bajariladi. Shuning uchun u muhim kod bayonotini bajarish uchun ishlatiladi. Biz finally blokni try bloki bilan ishlatishimiz va u yerdan catch blokini o'tkazib yuborishimiz mumkin.
try bloki bilan finally blokining sintaksisi:
try {
// istisnolarni keltirib chiqaruvchi kod
} finally {
// finally kodi
}
Finally blokni sinab ko'rish bloki bilan ishlatish uchun Kotlin dasturi:
fun main(args : Array<String>){
try{
var ar = arrayOf(1,2,3,4,5)
var int = ar[6]
println(int)
}
finally {
println("Bu blok har doim istisno bajaradi.")
}
}
Yuqoridagi dasturda biz finally block bilan try dan foydalandik va catch blokini o'tkazib yubordik. Bu yerda istisno catch bloki tomonidan ishlanmaydi, lekin finally blokini bajaradi.
try-catch bloki bilan finally blokining sintaksisi:
try {
// istisnolarni keltirib chiqaradigan kod
} catch(e: ExceptionName) {
// istisnoni ushlang va uni boshqaring.
}
finally {
// nihoyat blok kodini
}
Shuningdek, try, catch va finally bloklardan birgalikda foydalanishimiz mumkin.
try-catch bloki bilan finally blokdan foydalanish uchun Kotlin dasturi:
fun main (args: Array<String>){
try {
var int = 10 / 0
println(int)
} catch (e: ArithmeticException) {
println(e)
} finally {
println("Ushbu blok har doim ishlaydi.")
}
}
Kotlin throw kalit so'zi
Kotlinda biz aniq istisno qilish uchun throw kalit so'zidan foydalanamiz. Bundan tashqari, maxsus istisnoni tashlash uchun ham foydalanish mumkin.
Throw kalit so'zidan foydalanish uchun Kotlin dasturi:
fun main(args: Array<String>) {
test("abcd")
println("tasdiqlashdan keyin amalga oshiriladi.")
}
fun test(password: String) {
if (password.length < 6)
throw ArithmeticException("Parol juda qisqa.")
else
println("Kuchli parol.")
}