Študijné materiály

Výnimky (exceptions) nám umožňujú riešiť chybové stavy v programe. V Kotline používame bloky try, catch a finally:

fun main() {
    try {
        val cislo = readln().toInt()
        println("Cislo: $cislo")
    } catch (e: NumberFormatException) {
        println("Zadane cislo nie je platne!")
    }
}

13.1.1 Viacero catch blokov

Môžeme odchytiť viacero typov výnimiek:

fun main() {
    try {
        val a = readln().toInt()
        val b = readln().toInt()
        println(a / b)
    } catch (e: ArithmeticException) {
        println("Delenie nulou!")
    } catch (e: NumberFormatException) {
        println("Zadane cislo nie je platne!")
    }
}

13.1.2 finally

Blok finally sa vykoná vždy, či už výnimka nastala alebo nie:

fun main() {
    try {
        val cislo = readln().toInt()
        println(cislo)
    } catch (e: NumberFormatException) {
        println("Chyba!")
    } finally {
        println("Hotovo")
    }
}

13.1.3 try-catch ako výraz

V Kotline môže try-catch vrátiť hodnotu:

fun main() {
    val cislo: Int? = try {
        readln().toInt()
    } catch (e: NumberFormatException) {
        null
    }

    println(cislo) // cislo alebo null
}

13.1.4 Vyhadzovanie výnimiek

Výnimky vyhadzujeme pomocou kľúčového slova throw:

fun checkAge(age: Int) {
    if (age < 0) {
        throw IllegalArgumentException("Vek nemoze byt zaporny!")
    }
    println("Vek: $age")
}

fun main() {
    checkAge(-5)  // vyhodi vynimku
}

Výnimky by sme mali používať len na ozajstné chyby, nie na bežné riadenie programu.

Úlohy

Úloha 1

Načítaj číslo zo vstupu a pri neplatnej hodnote odchyť NumberFormatException.

Úloha 2

Napíš bezpečné delenie dvoch čísel s odchytením delenia nulou a blokom finally.

Úloha 3

Vytvor funkciu, ktorá pomocou throw odmietne záporný vek.