What's the difference between !! and ? in Kotlin?

As it said in Kotlin reference, !! is an option for NPE-lovers :)

a!!.length

will return a non-null value of a.length or throw a NullPointerException if a is null:

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

a?.length

returns a.length if a is not null, and null otherwise:

val a: String? = null
print(a?.length) // >>> null is printed in the console

To sum up:

+------------+--------------------+---------------------+----------------------+
| a: String? |           a.length |           a?.length |           a!!.length |
+------------+--------------------+---------------------+----------------------+
|      "cat" | Compile time error |                   3 |                    3 |
|       null | Compile time error |                null | NullPointerException |
+------------+--------------------+---------------------+----------------------+

Might be useful: What is a NullPointerException?


the precedence of operators !, ?., !! is ?. > !! > !.

the !! operator will raising KotlinNullPointerException when operates on a null reference, for example:

null!!;// raise NullPointerException

the safe call ?. operator will return null when operates on a null reference, for example:

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

the !! operator in your second approach maybe raise NullPointerException if the left side is null, for example:

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

you can using the elvis operator ?: instead of the !! operator in your case, for example:

!(mCurrentDataset?.load(..)?:false)

this is '!!' double-bang operator is always return not-null value and this is '?' safe call operator returns value if value is not null, and null otherwise

This is unsafe nullable type (T?) conversion to a non-nullable type (T). It will throw NullPointerException if the value is null.

It is documented here along with Kotlin means of null-safety.

ref - hotkey

Tags:

Kotlin