Ненулевое утверждение Kotlin для null

Поскольку у Kotlin есть ненулевое утверждение, я нашел кое-что забавное...

val myvar: String = null!!

Это рухнет.

Но дело в том, что он не проверяет во время компиляции.

Приложение будет аварийно завершать работу во время выполнения.

Разве это не должно вызывать ошибку времени компиляции?


person RBK    schedule 27.06.2017    source источник
comment
К вашему сведению: IntelliJ IDEA помечает val myvar: String = предупреждением: недостижимый код.   -  person mfulton26    schedule 27.06.2017


Ответы (1)


!! оценивается во время выполнения, это просто оператор.

Выражение (x!!)

  • бросает KotlinNullPointerException, если x == null,
  • в противном случае он возвращает x, приведенный к соответствующему ненулевому типу (например, он возвращает его как String при вызове переменной с типом String?).

Это, конечно, делает null!! сокращением для throw KotlinNullPointerException().


Если это поможет, вы можете думать о том, что !! делает то же самое, что и функция, подобная этой:

fun <T> T?.toNonNullable() : T {
    if(this == null) {
        throw KotlinNullPointerException()
    }
    return this as T // this would actually get smart cast, but this 
                     // explicit cast demonstrates the point better
}

Таким образом, выполнение x!! даст вам тот же результат, что и x.toNonNullable().

person zsmb13    schedule 27.06.2017