Почему "!!" требуется при преобразовании строкового значения readline в int - PullRequest
0 голосов
/ 12 января 2020

Я новичок в kotlin, и я занимаюсь исследованием синтаксиса языка. Насколько я понимаю, в kotlin вы можете приводить типы данных с помощью встроенных функций, таких как:

.toInt() 

, преобразующих 3,14 в целое число:

3.14.toInt()

, поскольку известно, что readline() функция возвращает строку, я не уверен, почему этот синтаксис правильный:

fun main() {
    println("please enter a int:")
    val num1 = readLine()!!.toInt()
    println("one more")
    val num2 = readLine()!!.toInt()

    println("sum : ${num1 + num2}")
}

и этот синтаксис неправильный

fun main() {
    println("please enter a int:")
    val num1 = readLine().toInt()
    println("one more")
    val num2 = readLine().toInt()

    println("sum : ${num1 + num2}")
}

возвращает ошибку:

 Error:(5, 26) Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String

Просто ищите немного больше объяснения о приведении типов и различии синтаксиса, когда речь идет о функции readline() и ее функциях.

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Метод readLine() возвращает String? - знак вопроса означает, что он может быть либо null, либо String. В Kotlin вам нужно обрабатывать экземпляры с обнуляемым типом либо с ?, либо с !!, когда вы вызываете метод для этого экземпляра.

Разница в том, что ? продолжается только тогда, когда экземпляр не нулевой, и !! заставляет его продолжаться. Последний может дать вам NullPointerException.

Например:

val num1 = readLine()?.toInt()
// Here, num1 could either be a String or null

val num1 = readLine()!!.toInt()
// if it goes to this next line, num1 is not null. Otherwise throws NullPointerException
1 голос
/ 12 января 2020

readLine () возвращает строку? (Обнуляемая версия String?) Функция toInt () получает String (тип, не обнуляемый).

fun String.toInt(): Int   // non-nullable
fun String?.toInt(): Int  // nullable (call)

Вы должны выполнить какую-то проверку нуля, чтобы быть уверенным, что toInt будет вызываться для ненулевого значения объект. !! оператор преобразует обнуляемую строку? введите в необнуляемую строку.

...