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,如果a是null:
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)
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
符的优先级!,?.,!!是?.> !!> !.
该!!运营商将提高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)
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(部门负责人),依此类推。
如果学生,部门或学院的任何一位为空,则结果将为空。
| 归档时间: |
|
| 查看次数: |
12750 次 |
| 最近记录: |