kotlin - Kotlin : if String is null and double bang(!!) operator is used, why does it give compile error for length function?

标签 kotlin compiler-errors string-length non-nullable kotlin-null-safety

例:

fun main(){
    var userInput: String?
    //userInput = null
    userInput = "asbdef"
    var inputLength:Int? = userInput!!.length
    println("Length of the string is :"+inputLength)
}
输出:
字符串的长度是:6
fun main(){
    var userInput: String?
    userInput = null
    //userInput = "asbdef"
    var inputLength:Int? = userInput!!.length
    println("Length of the string is :"+inputLength)
}
输出:
Unresolved reference :长度
我想知道为什么会出现编译错误?
如果仅将(!!)运算符替换为(?),则编译效果很好,但将输出打印为null。
PS:我是Kotlin的新手

最佳答案

如果左侧求值?.,则null运算符会短路。因此,nullVariable?.length的结果为null,并且从未评估.length。您的第一个示例实际上是在做:

println("Length of the string is :" + null)
!!运算符说:“如果左侧为null,则抛出NullPointerException。否则,我们知道右侧不为null”。如果您稍微更改第二个示例,则可以看到以下内容:
val userInput: String? = null
val inputLength:Int = userInput!!.length // throws NullPointerException

但是,我不确定为什么会收到Unresolved reference: length。当您直接将null分配给userInput时,似乎编译器正在进行一些优化,因此与其将其编译为在运行时抛出NPE的String?,它知道该值仅是null(而不是String?),因此,在编译时不能具有length属性,因为null不是引用。
您可以通过函数调用添加抽象层来强制将其赋予NullPointerException:
fun main(){
    var userInput: String? = "foo"
    userInput = alwaysNull()
    val inputLength:Int = userInput!!.length // NullPointerException
}

fun alwaysNull(): String? = null
我在Null Safety文档中看不到任何关于在一行中初始化/通过函数调用与直接将null分配给var之间的行为差​​异的任何信息,因此在幕后获取Unresolved reference只是在猜测。

关于kotlin - Kotlin : if String is null and double bang(!!) operator is used, why does it give compile error for length function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64305496/

相关文章:

java - 为什么复选框中的框不可见?

android - 使用 Jetpack Compose 中的 AnimatedVisibility 进行动画处理时 IconButton 透明度存在问题

java - 如何确定构造函数的参数

c++ - 尝试运行已编译的 C++ 代码时出现段错误 11

c# - WPF 字符串长度转换器

ios - NSString 对象的 length 属性有一个不正确的值

swift - Kotlin 有类似 Swift Optional 的类型吗?

Ubuntu 中的 Java 编译器错误

c - 在链接到静态库的 DEV-CPP 中构建控制台应用程序时,如何解决对 _imp__** 的 undefined reference ?

ruby - 如何将 Ruby 字符串强制为 n 个字符