readln în Kotlin

Citește un rând scris de utilizator la tastatură; readlnOrNull returnează null când nu mai există date.

Sintaxă
fun readln(): String
fun readlnOrNull(): String?

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() + 1 lipește textul "1" la final în loc să adune. Convertește întâi cu toInt().
  • 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, dar readln() 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.