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ă:
checkaruncăIllegalStateException, nuIllegalArgumentException, deci uncatchpentru aceasta din urmă nu o prinde.