和…之间的不同 !! 和? 在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
的非空值,如果a
为null
则抛出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 – 热键