В чем отличие между readLine() и readln() в Kotlin?

Пытался написать консольный калькулятор и столкнулся со следующей проблемой.

Если в переменную присваивать значение через readLine(), то в последующем ее нельзя преобразовать с помощью функции toInt(). А если использовать функцию readln(), то компилятор во время преобразования не ругается.

В чем разница?


Ответы (2 шт):

Автор решения: Крест Доминика Туретта

https://kotlinlang.org/docs/whatsnew16.html#new-readline-functions Если вкратце, то readln() возвращает not null тип String, а если строку не удается прочитать бросает RuntimeException. В свою очередь readline() возвращает String?, которая может быть null. Более новой альтернативой к последнему является добавленная в 1.6.0 readlnOrNull().

→ Ссылка
Автор решения: Vadik

Можно перейти в реализацию метода readln() и сразу все станет ясно:

public actual fun readln(): String =
    readLine() ?: throw ReadAfterEOFException("EOF has already been reached")

Единственное отличие readln() от readLine() это то, что первый метод выбросит исключение, когда будет достигнут конец файла, а второй метод молчаливо вернет null.

Если для вашей задачи подохдит readLine(), то вместо него лучше использовать более говорящий эквивалент readlnOrNull(). В будущих релизах readLine() будет помечен как устаревший.


Так как в вашей программе вы вводите данные из консоли, то EOF, конец файла, можно сымитировать, нажав Ctrl+D (или Ctrl+Z для Windows). Посмотрите, как поведет ваша программа:

  • Если вы используете readln(), то получите ошибку EOF has already been reached и программа завершится, если вы не обработаете это исключение.

  • Если же вы используете readLine() или readlnOrNull(), то вы сами можете проверить результат на null и решить что делать в таком случае. Завершить программу с ошибкой или что-то другое:

    val number = readLine()?.toInt()
    if (number == null) {
        // достигли конца файла
    }
    
→ Ссылка