Študijné materiály

Ak potrebujeme vlastný typ výnimky, jednoducho vytvoríme triedu, ktorá dedí z Exception:

class InsufficientFundsException(amount: Double) :
    Exception("Nedostatocny zostatok! Potrebujes $amount EUR")

class BankAccount(private var balance: Double = 0.0) {
    fun withdraw(amount: Double) {
        if (amount > balance) {
            throw InsufficientFundsException(amount - balance)
        }
        balance -= amount
        println("Vybrate: $amount, Zostatok: $balance")
    }

    fun deposit(amount: Double) {
        balance += amount
    }
}

fun main() {
    val account = BankAccount()
    account.deposit(100.0)
    account.withdraw(50.0)   // Vybrate: 50.0, Zostatok: 50.0
    account.withdraw(75.0)   // vyhodi InsufficientFundsException
}

13.2.1 Triedy výnimiek

V Kotline existuje dedičská hierarchia výnimiek:

  • Throwable - základná trieda
    • Exception - ozajstné chyby (môžeme odchytávať)
      • RuntimeException - chyby bežiaceho času (nepovinné odchytávanie)
        • IllegalArgumentException
        • IllegalStateException
        • NumberFormatException
      • IOException - chyby vstupu/výstupu
    • Error - kritické chyby JVM (nemá zmysel odchytávať)

13.2.2 Checked vs Unchecked

V Kotline sú všetky výnimky unchecked (na rozdiel od Javy). To znamená, že nemusíme deklarovať, aké výnimky môže funkcia vyhodiť:

// V Jave by sme museli napisat throws FileNotFoundException
// V Kotline to nie je potrebne
fun readFile(path: String): String {
    return File(path).readText()
}

Unchecked výnimky nemusíme odchytávať, ale ak to nespravíme a výnimka nastane, program spadne.

Úlohy

Úloha 1

Vytvor vlastnú výnimku NeplatneHesloException s popisnou správou.

Úloha 2

V triede Registracia vyhoď túto výnimku, ak má heslo menej než osem znakov.

Úloha 3

V main vlastnú výnimku odchyť a vypíš používateľovi jej správu.