Kotlinが初めてです。以下のコードで、この2つの!!
と?
の違いを知りたいです。
最初にmCurrentDatasetに!!
を使用するスニペットと、同じ変数に?
を使用するスニペットが2つあります。
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 reference で述べたように、!!
はNPE愛好家のためのオプションです:)
a!!.length
a
がnull
の場合、a.length
の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とは?
演算子の優先順位!
、?.
、!!
は?.
> !!
> !
です。
!!
演算子は、KotlinNullPointerException
参照を操作するときにnull
を発生させます。例:
null!!;// raise NullPointerException
安全な呼び出し?.
演算子は、null
参照を操作するときにnull
を返します。例:
(null as? String)?.length; // return null;
2番目のアプローチの!!
演算子は、左側がNullPointerException
の場合にnull
を発生させる場合があります。次に例を示します。
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(部門の長)などを探します。
学生、学科、ホッドのいずれかがヌルの場合、結果はヌルになります。
SafeCall Operator(?):
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