A.4 Null-Sicherheit 

Nicht nur in Java sind null-Referenzen oft ein Grund für Abstürze und Ausnahmen. Viele Programmiersprachen mit Referenztypen haben damit zu kämpfen. Solche Fehler sind nicht selten schwer zu finden, weil sie nur unter ganz bestimmten Bedingungen auftreten und vom Compiler nicht entdeckt werden. Der Computerwissenschaftler Tony Hoare hat die Einführung der Null-Referenz in ALGOL W als seinen billion-dollar mistake bezeichnet.[ 20 ](https://en.wikipedia.org/wiki/Null_pointer)
A.4.1 Nullbare Typen 

Standardmäßig kann kein Referenztyp in Kotlin den Wert null annehmen. Die Zeile val s: String = null ist ungültig. Wenn Sie in Ihrem Code null-Referenzen verwenden müssen, fügen Sie am Ende des Typs ? hinzu (String?, Int?, ...). Das kommt vor allem bei der Verwendung von Java-Bibliotheken vor, also auch unter Android. Listing A.29 ermittelt eine Zufallszahl. Ist sie 3, wird die Referenz auf null gesetzt. Damit println ( ... ) übersetzt und ausgeführt werden kann, ist if (a != null) nötig.
Listing A.29 Verwendung von nullbaren Typen
Allerdings ist das kein schöner Code. Anstelle der if-Anweisung können Sie schreiben:
println(a?.toString(2))
Das ? sorgt dafür, dass toString(2) nur aufgerufen wird, wenn a nicht null ist. Allerdings, und das ist ein wichtiger Unterschied, wird println() auf jeden Fall ausgeführt. Hat a den Wert null, wird auch »null« ausgegeben. Falls gewünscht, können Sie auf folgende Weise das Verhalten bei if erreichen:
a?.let( {println(it.toString(2))} )
Der Funktion let wird ein Lambda-Ausdruck übergeben. Er erhält den Wert von a in der Variable it, falls a nicht null ist. Sehen Sie sich hierzu ein weiteres Beispiel an:
val l: List<String?> = listOf("Eins", null, "Drei")
for (i in l) {
i?.let { println(it)}
}
Listing A.30 Verwendung von »let«
In Listing A.30 wird eine Liste mit drei Strings definiert. Der zweite ist null. Beim Iterieren über l stellt i? sicher, dass let nur bei "Eins" und "Drei" aufgerufen wird. let ist eine sogenannte Scope-Funktion.[ 21 ](https://kotlinlang.org/docs/reference/scope-functions.html) Die Kotlin-Standardbibliothek enthält mehrere solcher Funktionen. Deren Zweck ist die Ausführung eines Code-Blocks im Kontext eines Objektes. Beim Aufruf einer solchen Funktion mit einem Lambda-Ausdruck wird ein temporärer Scope erzeugt, in dem auf das Objekt ohne seinen Namen zugegriffen werden kann. Außer let gibt es run, with, apply und also. In Listing A.31 werden alle Elemente einer Liste, die ungleich null sind, als Zahl interpretiert und quadriert. also zählt, wie viele dies sind.
var c = 0
val l: List<Int?> = listOf(1, null, 3, 4)
for (i in l) {
i?.let { println(it * it) }
?.also { c++ }
}
println("${l.toString()} hat $c Elemente ungleich null")
Listing A.31 Verwendung der Scope-Funktion »also«
Listing A.32 zeigt die Verwendung von run. Mit indexOf() wird die Position des Kommas in der Zeichenkette »Hallo, Kotlin« ermittelt. Das Ergebnis plus 2 wird an substring() übergeben. println() gibt dann »Kotlin« aus.
val s = "Hallo, Kotlin"
s.run {
println(substring(indexOf(',') + 2))
}
Listing A.32 Verwendung der Scope-Funktion »run«
Ist es nicht äußerst praktisch, die zwei eigentlich notwendigen this weglassen zu können? Der Code wirkt sehr kompakt, bleibt aber verständlich.
A.4.2 Elvis Operator und unsicherer Zugriff 

Ich hatte Ihnen die let-Funktion in Verbindung mit ? gezeigt, weil ich Code nur ausführen wollte, wenn eine Referenz ungleich null ist. Um auch hier möglichst schlanken und doch verständlichen Quelltext schreiben zu können, kennt Kotlin den Elvis Operator. Er ist in Listing A.33 zu sehen. Seinen Namen hat der Operator in Anspielung an die Frisur des berühmten Rock- and-Roll-Sängers erhalten. Wenn Sie den Kopf beim Betrachten der Zeichenfolge ?: in Richtung linke Schulter neigen, sehen Sie, was ich meine ...
val s: String? = null
println(s?.length ?: -1)
Listing A.33 Verwendung des Elvis Operators
Bitte beachten Sie, dass sich zwischen den zwei Zeichen kein Leerzeichen befinden darf. Das Ergebnis des Operators ist der linke Ausdruck, sofern dieser ungleich null ist, sonst der rechte. Java-Programmierer kennen den ternary operator ? : (mit Leerzeichen). Er funktioniert ähnlich, ist aber flexibler. Dafür kann in Kotlin if als Ausdruck verwendet werden.
Wenn Sie sicher sind, dass die Referenz auf einen nullbaren Typ nicht null ist, können Sie anstelle von ? vor den Zugriff mit . den Operator !! stellen. Das ist in Listing A.34 zu sehen. Da die Variable s mit null initialisiert wird, führt der Zugriff auf length unweigerlich zu einer NullPointerException.
try {
val s: String? = null
println(s!!.length)
} catch (e: NullPointerException) {
println("Crash")
}
Listing A.34 Unsicherer Zugriff mit »!!«
Im folgenden Abschnitt widmen wir uns dem Thema Objektorientierung. Ich zeige Ihnen unter anderem, wie Sie Klassen definieren und Objekte instanziieren.