В чем отличие между 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().
Можно перейти в реализацию метода 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) { // достигли конца файла }