Kotlinде каталарды туура иштетүүнүн жолдору кандай?
sobes.tech AI
AIден жооп
Котлинде ката кетирүү үчүн try...catch...finally структурасы колдонулат. Java коду менен өз ара аракеттенүү үчүн @Throws белгиленген функцияларды чакырса болот.
fun readFile(path: String): String {
return try {
// коркунучтуу кодду ишке ашырууга аракет кылуу
java.io.File(path).readText()
} catch (e: java.io.IOException) {
// конкреттүү катага иштетүү
println("Файлды окууда ката: ${e.message}")
"" // ката болгондо алдын ала коюлган маанини кайтаруу
} finally {
// ар дайым ишке ашырылуучу блок, ката болобу же жокпу
println("Файлды окуу аракеттери аяктады")
}
}
Ар кандай ката түрлөрүн иштетүү үчүн бир нече catch блокторун колдонсо болот:
fun processData(data: String) {
try {
// Код, ал NumberFormatException же NullPointerException чыгара алат
val number = data.toInt()
println("Сан: $number")
} catch (e: NumberFormatException) {
println("Жараксыз сан форматы: ${e.message}")
} catch (e: NullPointerException) {
println("Нөлдүк маалымат алынды: ${e.message}")
}
}
Котлинде Java сыяктуу текшерилген ката жок. Функциялар @Throws аркылуу ката чыгара турганын жарыялай алат, бирок бул милдеттүү эмес.
Ката болуу мүмкүнчүлүгү бар функциялар үчүн, көбүнчө sealed-класстар же Result-тип колдонулат (эксперименталдык Kotlin версияларында), өзгөчө асинхрондук коддо.
Мисал sealed-класс менен:
sealed class Result<out T>
data class Success<out T>(val value: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()
fun safelyDivide(a: Int, b: Int): Result<Int> {
return try {
if (b == 0) {
throw ArithmeticException("Нөлгө бөлүү")
}
Success(a / b)
} catch (e: Throwable) {
Error(e)
}
}
// Колдонуу:
fun processDivision() {
when (val divisionResult = safelyDivide(10, 0)) {
is Success -> println("Жыйынтык: ${divisionResult.value}")
is Error -> println("Ката: ${divisionResult.exception.message}")
}
}
Тек гана иштетүү мүмкүнчүлүгү бар ката түрлөрүн кармоо маанилүү. Пустой catch блокторду колдонбоо керек. Керек болсо, катанын маалыматын логго жазса болот.
Ката чыгарып салуу үчүн throw сөзүн колдонсо болот:
fun requirePositive(number: Int) {
if (number <= 0) {
throw IllegalArgumentException("Сан оң болушу керек")
}
}