簡體   English   中英

有什么區別!! 和? 在科特林?

[英]What's the difference between !! and ? in Kotlin?

我是 Kotlin 的新手。 我想知道這兩者的區別!! ? 在下面的代碼中。

下面,有兩個片段:第一個使用!! 對於mCurrentDataset和另一個有? 對於同一個變量。

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 ,例如:

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

!! 如果左側為null ,則第二種方法中的運算符可能會引發NullPointerException ,例如:

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

您可以使用 elvis 運算符?:而不是!! 您的情況下的運營商,例如:

!(mCurrentDataset?.load(..)?:false)
In Addition to what Alexander said and as shown in the docs too, 

?. 安全調用運算符在鏈接中非常有用,像這樣

student?.department?.hod?.name

如果沒有學生,則返回 null 否則查找他的部門。 如果部門不存在則返回 null 否則尋找 hod(部門負責人)等等。

如果 student、department 或 hod 中的任何一個為 null,則結果將為 null。

這是 '!!' double-bang 運算符總是返回非空值,這是 '?' 如果值不為空,則安全調用運算符返回值,否則為空

這是不安全的可為空類型 (T?) 轉換為不可空類型 (T)。 如果值為 null,它將拋出 NullPointerException。

它與 Kotlin 的 null-safety 方法一起記錄在此

參考 - 熱鍵

安全呼叫操作員

在科特林

var a = x?.length;

Java 中的等效代碼

int a = valueOfInt();

int valueOfInt() {
    if (x != null) {
        return x;
    } else {
        return null;
    }
}

側鏈規則

bob?.department?.head?.name

它可以讀作->

如果bob不為空,請給我department

如果department不為空,給我head

如果head不為 null 給我name

如果其中任何一個為null ,則返回null

? 數據類型之前

如果 ? 在數據類型之前使用,例如:

val b: String? = null

這意味着您可以為其分配空值,否則無法為其分配空值。

這 !! 操作員

對於那些喜歡在他們的程序中有空指針異常 (NPE)的人。

val l = b!!.length

如果b不為空,這將返回b的非空值,或者如果b為空則拋出 NPE

安全呼叫操作員(?):

var a: String = "abc"
a = null  //compile time error

val b: String? = null
val result = b?.length//returns null

斷言運算符(!!):

 val b: String? = "dd" //any value or null 
 val l = b!!.length 
//this throws null pointer exception if b is null otherwise returns actual

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM