Answers:
这是不安全的可为null的类型(T?
)到非可为null的类型()的转换T
,
如果值为!!
则会抛出NullPointerException
该异常null
。
在此与Kotlin的null-safety方法一起记录在案。
sale.latest
可以包含null
; 仅当sale.latest
不为null时,分配将成功,否则将抛出NPE。这提供了null安全性val price
:其类型将为非null。参见kotlinlang.org/docs/reference/null-safety.html
!!
您可以快速失败并找到NPE的根本原因。我希望Java具有类似的功能(即没有丑陋的if
声明和/或assert
离子)。
这是使情况更清楚的示例。说你有这个功能
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
这将产生以下编译错误。
Null can not be a value of a non-null type String
现在,您可以通过在String
类型中添加问号使其可为空来防止这种情况。
所以我们有
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
这产生了一个结果
null
现在,如果我们希望函数在email值为null时引发异常,则可以在email末尾添加两个感叹号。像这样
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
这会抛出一个 KotlinNullPointerException
对于NullPointerException
(或简称NPE)的粉丝,Double-bang运算符是一个绝佳选择。
该不是空断言运营商
!!
转换为任意值非空类型,如果值为null抛出异常。
val nonNull = a!!.length
因此,您可以编写a!!
,这将返回非null值a
(String
例如a),如果a
为null,则抛出NPE 。
如果需要NPE,可以拥有它,但是必须明确要求它。在开发人员保证的情况下应使用此运算符-该值永远不会为null。
!!
语句结束时是什么意思?IJ自动转换为Kotlin为我做到了val price = sale.latest!!