除了客户编码帮助,'!!'的好处是什么? Kotlin中的运算符,如果它在对象为空时抛出NPE?

时间:2018-03-08 14:32:07

标签: java kotlin

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。但除了帮助客户编写代码之外,这个运算符'!!'还有其他好处吗?

2 个答案:

答案 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]!!
}

在此示例中,地图保证具有给定键的值,因为Aenum class,并且您已使用所有可能的值初始化地图。但是,编译器无法识别,因为Map.get为任何映射返回可为空的类型。在这种情况下,您仍然可以写:

val x = aNames[a]
if (x == null) { ... }

但是,条件永远不会成立,编写代码来处理不可能的条件是没有意义的。因此,您可以通过使用!!简单地告诉编译器条件是不可能的!操作

答案 1 :(得分:3)

  

Kotlin在编译时本身就有非常漂亮的空值检查。

在编译时检查不是空检查,但是 nullability 检查。如果将值声明为可为空,则编译器会确保您不能取消引用它。如果添加运行时空检查,编译器会注意到这一点,并将您的值强制转换为非可空类型。

  

除了帮助客户编写代码之外,这个运营商还是可以使用#&... 39有其他好处吗?

!!运算符完全证明自己是null-check和throw-statement的快捷方式。这是一个很大的好处。

编译器没有超级大国,也无法将不安全的代码转换为空安全代码。这尤其适用于调用null-unsafe Java库。