Sobes.tech
Junior

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("Сан оң болушу керек")
    }
}