check în Kotlin

Verifică starea programului și aruncă IllegalStateException dacă nu este cea așteptată; checkNotNull cere o valoare diferită de null.

Sintaxă
fun check(value: Boolean)
inline fun check(value: Boolean, lazyMessage: () -> Any)
inline fun <T : Any> checkNotNull(value: T?, lazyMessage: () -> Any): T

Ce face check

check(conditie) { "mesaj" } funcționează ca require, dar aruncă IllegalStateException. Se folosește pentru starea obiectului sau a programului: „coșul nu e gol”, „fișierul a fost deschis”, „jocul a început”.

checkNotNull(valoare) { "mesaj" } verifică dacă o valoare a fost inițializată și o returnează cu tip non-null. Fără bloc de mesaj, check are mesajul „Check failed.”, iar checkNotNull „Required value was null.”.

Parametri

Parametru Descriere
value Condiția care trebuie să fie adevărată sau valoarea care nu trebuie să fie null.
lazyMessage: () -> Any Bloc care produce mesajul; rulează doar la eșec.

Ce returnează

check: nimic. checkNotNull: valoarea, cu tip non-null. Ambele aruncă IllegalStateException la eșec.

Exemple

Exemplul 1: Starea unui coș de cumpărături

Plata nu are sens cu un coș gol; check oprește operația cu un mesaj clar.

class Cos {
    private val produse = mutableListOf<Pair<String, Double>>()
    fun adauga(nume: String, pret: Double) = produse.add(nume to pret)
    fun plateste(): Double {
        check(produse.isNotEmpty()) { "Coșul este gol, nu ai ce plăti" }
        return produse.sumOf { it.second }
    }
}

fun main() {
    val cos = Cos()
    try {
        cos.plateste()
    } catch (e: IllegalStateException) {
        println("Eroare: ${e.message}")
    }
    cos.adauga("pâine", 4.5)
    cos.adauga("cașcaval", 18.9)
    println("De plată: ${cos.plateste()} lei")
}

Rezultat

Eroare: Coșul este gol, nu ai ce plăti
De plată: 23.4 lei

Exemplul 2: checkNotNull pentru o setare încărcată mai târziu

var orase: List<String>? = null

fun primulOras(): String {
    val lista = checkNotNull(orase) { "Lista de orașe nu a fost încărcată" }
    return lista.first()
}

fun main() {
    try {
        primulOras()
    } catch (e: IllegalStateException) {
        println(e.message)
    }
    orase = listOf("Sibiu", "Arad")
    println(primulOras())
    try {
        checkNotNull(mapOf("Iași" to 5)["Galați"])
    } catch (e: IllegalStateException) {
        println(e.message)
    }
}

Rezultat

Lista de orașe nu a fost încărcată
Sibiu
Required value was null.

Greșeli frecvente

  • Folosești check pentru argumentele funcției. Pentru argumente greșite convenția este require (IllegalArgumentException).
  • Prinzi excepția greșită: check aruncă IllegalStateException, nu IllegalArgumentException, deci un catch pentru aceasta din urmă nu o prinde.

Comenzi înrudite

  • require: Verifică argumentele unei funcții și aruncă IllegalArgumentException dacă nu sunt bune; requireNotNull cere o valoare diferită de null.
  • error: error aruncă imediat IllegalStateException cu un mesaj; TODO marchează cod încă nescris și aruncă NotImplementedError.