Ненулевое утверждение Котлина о нуле
Поскольку у Котлина есть ненулевое утверждение, я нашел несколько забавных вещей...
val myvar: String = null!!
Это потерпит крах.
Но дело в том, что он не проверяется во время компиляции.
Приложение будет зависать во время выполнения.
Разве это не должно вызвать ошибку времени компиляции?
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()
,