2 min read
·
By Einar Afiouni
·
December 2, 2019
One of the most common mistakes of many programming languages is accessing a member of a null
reference which results in an exception. Most people have probably experienced getting NullPointerExceptions in Java, or NPE for short. Kotlin's type system, on the other hand, is aimed at eliminating this.
In Kotlin, the type system distinguishes between nullable references and non-nullable references. For example, a String variable cannot be null
.
var nice: String = "Mrs. Claus"
nice = null // This won't compile
Preferably you wouldn't want to introduce nullability into your code, but sometimes null
is inevitable and then it's important to know how to keep your code null safe.
To allow, then, an object to be null
, we can declare it as a nullable object by suffixing the type with ?
var naughty: String? = "Santa Claus"
naughty = null // This compiles now
Now, if you try to access a member of nice
, it's guaranteed not to cause an NPE, but since naughty
is nullable, if you try to do the same on it, the compiler reports an error.
val niceLength = nice.length // length: 10
val naughtyLength = naughty.length // error: variable 'naughty' can be null
To get round this we can check whether the variable is null
by doing
val naughtyLength = if (naughty != null) naughty.length else -1
Or by using the safe call operator ?.
val naughtyLength = naughty?.length
The safe call operator returns the length of naughty
if it is not null
and null
otherwise. You might be familiar with this this type of from other languages like C#.
Safe calls are especially usefully in chains.
santa?.elfs?.head?.name
This return null
if any part of the chain is null
.
We can also handle nullable objects using the elvis operator ?:
val naughtyLength = naughty.length ?: -1
The elvis operator here returns the length of naughty
if naughty
is not null
or -1
otherwise.
You can also tell Kotlin that a nullable object cannot be null by using the !!
operator. This converts any nullable type to a non-nullable type and throws an exception if the value is null
val naughtyLength = naughty!!.length
Thus, if you like and want to get NullPointerExceptions, you still can! You just have to ask for it first.