I'm converting Java to Kotlin with Android Studio. I get double bang after the instance variable. What is the double bang and more importantly where is this documented?
mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
This is unsafe nullable type (T?
) conversion to a non-nullable type (T
), !!
will throw NullPointerException
if the value is null
.
It is documented here along with Kotlin means of null-safety.
Here is an example to make things clearer. Say you have this function
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
This will produce the following compilation error.
Null can not be a value of a non-null type String
Now you can prevent that by adding a question mark to the String
type to make it nullable.
So we have
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
This produces a result of
null
Now if we want the function to throw an exception when the value of email is null, we can add two exclamations at the end of email. Like this
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
This will throw a KotlinNullPointerException
Kotlin's double-bang operator is an excellent sample for fans of NullPointerException
(NPE).
The not-null assertion operator !! converts any value to a non-null type and throws an exception if the value is null.
val nonNull = str!!.length
If you write str!!
, it'll return a non-null value of str
(str
is a String?
here) or throw an NPE if str
is null. This operator should be used in cases where the developer is guaranteeing – the value will never be null. If you want an NPE, you have to ask for it explicitly.
!! is an assertion that it is not null. Two exclamation marks after a nullable value convert it to a non-nullable type. At the same time, before the conversion, it is not checked in any way that the value really does not contain null. Therefore, if during the execution of the program it turns out that the value that the !! operator is trying to convert is still null, then there will be only one way out - to throw a NullPointerException.
Success story sharing
!!
is at the end of a statement? IJ auto-convert to Kotlin did that for meval price = sale.latest!!
sale.latest
can containnull
; the assignment will succeed only ifsale.latest
is not null and will throw NPE otherwise. This gives null-safety forval price
: its type will be non-null. See kotlinlang.org/docs/reference/null-safety.html!!
you can fail-fast and locate the root cause of a NPE. I wish Java had a similar feature (that is, w/o uglyif
statements and/orassert
ions).NullPointerException
, uselet
.T?.let{ it.addMarker() }
. By this way, you are safe.