web-dev-qa-db-ja.com

!!の違いそして?コトリンで

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
}

前もって感謝します。

43
paril

Kotlin reference で述べたように、!!はNPE愛好家のためのオプションです:)

a!!.length

anullの場合、a.lengthのnull以外の値を返すか、NullPointerExceptionをスローします。

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

a?.length

anullでない場合は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とは?

78

演算子の優先順位!?.!!?.> !!> !です。

!!演算子は、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)
7
holi-java
In Addition to what Alexander said and as shown in the docs too, 

?.セーフコールオペレーターは、次のようなチェーンで非常に便利です。

student?.department?.hod?.name

学生がいない場合はnullを返し、そうでない場合は学部を探します。部門が存在しない場合はnullを返し、そうでない場合はhod(部門の長)などを探します。

学生、学科、ホッドのいずれかがヌルの場合、結果はヌルになります。

5
Nitesh Ranjan

これは '!!' double-bang operatorは常にnull以外の値を返し、これは「?」 safe call operator値がnullでない場合は値を返し、そうでない場合はnullを返します

これは、nullを許可しない型(T)への安全でないnullを許可する型(T?)の変換です。値がnullの場合、NullPointerExceptionがスローされます。

それは文書化されています ここ Kotlinのヌル安全手段と一緒に。

ref- ホットキー

4
kishu mewara

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