[英]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
的非空值,如果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 |
+------------+--------------------+---------------------+----------------------+
運算符的優先級!
, ?.
, !!
是?.
> !!
> !
.
!!
當對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。
安全呼叫操作員
在科特林
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.