和…之间的不同 !! 和? 在Kotlin

我是Kotlin新手。 我想知道这两个之间的区别!!? 在下面的代码。

我有以下两个片段首先使用!! 为mCurrentDataset和另一个有? 对于相同的variables。

 if(!mCurrentDataset!!.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE)) { Log.d("MyActivity","Failed to load data.") return false } 

 if(!mCurrentDataset?.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE)!!) { Log.d("MyActivity","Failed to load data.") return false } 

提前致谢。

正如它在Kotlin参考中所说的, !! 是NPE爱好者的选择:)

 a!!.length 

将返回a.length的非空值,如果anull则抛出NullPointerException

 val a: String? = null print(a!!.length) // >>> NPE: trying to get length of null 

 a?.length 

如果a不为null ,则返回a.length ,否则返回null

 val a: String? = null print(a?.length) // >>> null is printed in the console 

总结一下:

 +------------+--------------------+---------------------+----------------------+ | a: String? | a.length | a?.length | a!!.length | +------------+--------------------+---------------------+----------------------+ | "cat" | Compile time error | 3 | 3 | | null | Compile time error | null | NullPointerException | +------------+--------------------+---------------------+----------------------+ 

可能是有用的: 什么是NullPointerException?

运营商的优先!?.!!?. > !! > !

!! 运算符在对null引用进行操作时会引发KotlinNullPointerException ,例如:

 null!!;// raise NullPointerException 

安全的电话?. 运算符在null引用上运行时会返回null ,例如:

 (null as? String)?.length; // return null; 

!! 在第二种方法中,如果左侧为null ,可能会引发NullPointerException ,例如:

 mCurrentDataset?.load(..)!! ^-------------^ | when mCurrentDataset== null || load() == null a NullPointerException raised. 

你可以使用猫王操作符?:而不是!! 运营商在你的情况,例如:

 !(mCurrentDataset?.load(..)?:false) 

这是 ‘!!’ double-bang运算符总是返回非空值,这是’?’ 如果值不为null,则安全调用操作符返回值,否则返回null

这是不安全的可空types(T?)转换为不可空types(T)。 如果值为null,它将抛出NullPointerException。

这里记载的是与Kotlin无效安全的手段。

ref – 热键