Ce face readln
readln() așteaptă ca utilizatorul să scrie ceva și să apese Enter, apoi returnează rândul ca String, fără caracterul de rând nou de la final. Rezultatul este mereu text: pentru numere îl convertești cu toInt() sau toDouble().
Dacă intrarea s-a terminat (de exemplu programul primește datele dintr-un fișier care s-a terminat), readln() aruncă o excepție RuntimeException. readlnOrNull() returnează în acest caz null, așa că este potrivită pentru a citi toate rândurile într-o buclă while.
Înainte de Kotlin 1.6 se folosea readLine(), care returna String?. În cod nou folosește readln() sau readlnOrNull().
Ce returnează
readln: rândul citit (String). readlnOrNull: rândul citit sau null la sfârșitul intrării.
Exemple
Exemplul 1: Citirea unui nume și a unei vârste
Fiecare apel citește un rând. Vârsta vine ca text, deci o convertim cu toInt() înainte de calcul.
fun main() {
print("Cum te cheamă? ")
val nume = readln()
print("Câți ani ai? ")
val varsta = readln().toInt()
println()
println("Salut, $nume! Peste 10 ani vei avea ${varsta + 10} de ani.")
}
Ce scrie utilizatorul (intrare)
Ana
21
Rezultat
Cum te cheamă? Câți ani ai?
Salut, Ana! Peste 10 ani vei avea 31 de ani.
Exemplul 2: Mai multe numere pe un singur rând
Rândul se împarte după spații cu split, apoi fiecare bucată se transformă în număr.
fun main() {
val note = readln().split(" ").map { it.toInt() }
println("Note: $note")
println("Media: ${note.average()}")
}
Ce scrie utilizatorul (intrare)
9 7 10 8
Rezultat
Note: [9, 7, 10, 8]
Media: 8.5
Exemplul 3: Citirea tuturor rândurilor cu readlnOrNull
Bucla se oprește când readlnOrNull returnează null, adică la sfârșitul datelor.
fun main() {
var total = 0.0
var produse = 0
while (true) {
val rand = readlnOrNull() ?: break
val (nume, pret) = rand.split(" ")
println("$nume: $pret lei")
total += pret.toDouble()
produse++
}
println("$produse produse, total $total lei")
}
Ce scrie utilizatorul (intrare)
pâine 4.5
lapte 7.2
mere 6
Rezultat
pâine: 4.5 lei
lapte: 7.2 lei
mere: 6 lei
3 produse, total 17.7 lei
Greșeli frecvente
- Aduni direct rezultatul lui readln:
readln() + 1lipește textul"1"la final în loc să adune. Convertește întâi cutoInt(). - Folosești readln într-o buclă care citește „până la final”. La sfârșitul intrării readln aruncă excepție; pentru asta există
readlnOrNull(). - Folosești încă
readLine()!!din codul vechi. Merge, darreadln()face același lucru mai clar.
Comenzi înrudite
println: Afișează o valoare pe ecran: println trece apoi la rând nou, print rămâne pe același rând.String.toInt: Transformă un text în număr întreg; toInt aruncă excepție la text invalid, toIntOrNull returnează null.String.split: Împarte un text în bucăți după un separator și returnează o listă de String-uri.