Kotlin在编译时本身就有非常漂亮的空值检查。
假设如下情况:
fun main(args: Array<String>) {
println("Please enter a number: ")
var num = readLine()!!.toInt()
println("Entered number is $num")
}
如果用户没有输入任何值或任何Int代码将抛出NPE。 相反,如果'?'。即使用null-safe,不会抛出任何异常(尽管会回复空值)。
我已经完成了这个blog。但除了帮助客户编写代码之外,这个运算符'!!'还有其他好处吗?
答案 0 :(得分:7)
在这个例子中,使用!!没有任何好处。在其他情况下,!!如果你知道一个值不是null并且你不想编写更冗长的代码来处理null case,可以使用它。
考虑这个例子:
enum class A { Foo, Bar }
val aNames = mapOf(A.Foo to "Foo", A.Bar to "Bar")
fun printName(a: A) {
val x: String = aNames[a]!!
}
在此示例中,地图保证具有给定键的值,因为A
是enum class
,并且您已使用所有可能的值初始化地图。但是,编译器无法识别,因为Map.get
为任何映射返回可为空的类型。在这种情况下,您仍然可以写:
val x = aNames[a]
if (x == null) { ... }
但是,条件永远不会成立,编写代码来处理不可能的条件是没有意义的。因此,您可以通过使用!!简单地告诉编译器条件是不可能的!操作
答案 1 :(得分:3)
Kotlin在编译时本身就有非常漂亮的空值检查。
在编译时检查不是空检查,但是 nullability 检查。如果将值声明为可为空,则编译器会确保您不能取消引用它。如果添加运行时空检查,编译器会注意到这一点,并将您的值强制转换为非可空类型。
除了帮助客户编写代码之外,这个运营商还是可以使用#&... 39有其他好处吗?
!!
运算符完全证明自己是null-check和throw-statement的快捷方式。这是一个很大的好处。
编译器没有超级大国,也无法将不安全的代码转换为空安全代码。这尤其适用于调用null-unsafe Java库。