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

par*_*ril 51 kotlin kotlin-android-extensions

我是Kotlin的新手.我想知道这两者之间的区别!!,并?在下面的代码.

我有两个片段首先使用!!mCurrentDataset而另一个?用于同一个变量.

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

提前致谢.

Ale*_*nov 87

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

a!!.length
Run Code Online (Sandbox Code Playgroud)

将返回非null值a.length或抛出NullPointerException,如果anull:

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

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

val a: String? = null
print(a?.length) // >>> null is printed in the console
Run Code Online (Sandbox Code Playgroud)

总结一下:

+------------+--------------------+---------------------+----------------------+
| a: String? |           a.length |           a?.length |           a!!.length |
+------------+--------------------+---------------------+----------------------+
|      "cat" | Compile time error |                   3 |                    3 |
|       null | Compile time error |                null | NullPointerException |
+------------+--------------------+---------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

可能有用:什么是NullPointerException?

  • 如果 a?.length 返回 null,在这种情况下也会抛出 NPE。我没有得到那个案例。 (2认同)

Mak*_*and 12

安全呼叫接线员

在科特林中

var a = x?.length;
Run Code Online (Sandbox Code Playgroud)

Java 中的等效代码

int a = valueOfInt();

int valueOfInt() {
    if (x != null) {
        return x;
    } else {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

侧链法则

bob?.department?.head?.name
Run Code Online (Sandbox Code Playgroud)

它可以读作->

如果bob不为空,请给我department

如果department不为空,给我head

如果head不为空,请给我name.

如果其中任何一个是null,则返回null

?数据类型之前

如果 ?在数据类型之前使用,例如:

val b: String? = null
Run Code Online (Sandbox Code Playgroud)

这意味着您可以为其分配空值,否则无法为其分配空值。

这 !!操作员

对于那些喜欢在程序中出现空指针异常 (NPE)的人。

val l = b!!.length
Run Code Online (Sandbox Code Playgroud)

b如果不为空,这将返回一个非空值,或者如果为空b,则抛出一个 NPEb


hol*_*ava 7

符的优先级!,?.,!!?.> !!> !.

!!运营商将提高KotlinNullPointerException时,在操作null的参考,例如:

null!!;// raise NullPointerException
Run Code Online (Sandbox Code Playgroud)

安全调用?.操作符将null在对null引用进行操作时返回,例如:

(null as? String)?.length; // return null;
Run Code Online (Sandbox Code Playgroud)

如果左侧是,则!!第二种方法中的操作员可能会抬起,例如:NullPointerExceptionnull

mCurrentDataset?.load(..)!!
    ^-------------^
           | 
when mCurrentDataset== null || load() == null a NullPointerException raised.
Run Code Online (Sandbox Code Playgroud)

你可以在你的情况下使用elvis操作符 ?:而不是!!操作符,例如:

!(mCurrentDataset?.load(..)?:false)
Run Code Online (Sandbox Code Playgroud)


kis*_*ara 5

这是 '!!' double-bang运算符始终返回非空值,这是“?” 如果值不为null,则安全调用运算符返回value,否则返回null

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

它与Kotlin的零安全手段一起记录在这里

ref- 热键


Nit*_*jan 5

In Addition to what Alexander said and as shown in the docs too, 
Run Code Online (Sandbox Code Playgroud)

?.安全调用操作是在链非常有用的,这样的事情

student?.department?.hod?.name
Run Code Online (Sandbox Code Playgroud)

如果没有学生,则返回null,否则寻找他的系。如果部门不存在,则返回null,否则查找hod(部门负责人),依此类推。

如果学生,部门或学院的任何一位为空,则结果将为空。