Der !!-Operator in Kotlin: Was es ist und wie man den Code nicht kaputt macht

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kotlin, Nulls und der doppelte Ausrufezeichen: Eine Einführung

\n\n

Haben Sie jemals in Kotlin programmiert, der Compiler hat sich über einen potenziellen null-Wert beschwert, und Sie haben als Antwort zwei Ausrufezeichen gesetzt — !! — und sind weitergemacht? Wenn ja, dann kennen Sie den Helden unseres Artikels bereits — den double bang-Operator (auch bekannt als !!-Operator in Kotlin).

\n\n

Dieses Symbol ist gleichzeitig ein Retter und ein gefährliches Werkzeug. Es sagt dem Compiler: „Halt den Mund, ich weiß, was ich tue, diese Variable ist definitiv nicht null.“ Aber wenn Sie sich irren, stürzt die Anwendung mit einem NullPointerException ab. Klingt beängstigend? Eigentlich ist es nur ein mächtiger Mechanismus, den man verstehen und mit Bedacht einsetzen sollte.

\n\n

In diesem Leitfaden werden wir untersuchen, was double bang Kotlin ist, wie es funktioniert, wo man es anwendet und wo man besser nach Alternativen sucht. Sie erfahren, wie Sie sich nicht ins eigene Bein schießen und zuverlässigen Code schreiben.

\n\n

Das Problem, das !! löst: Null Safety in Kotlin

\n\n

Kotlin wurde als Sprache entwickelt, die NullPointerException (NPE) eliminieren sollte. Und das ist ihr fast gelungen. In Kotlin können Typen standardmäßig nicht null sein. Sie können einer Variable vom Typ String einfach keinen null-Wert zuweisen — der Compiler lässt es nicht zu.

\n\n
var name: String = "Alice"\nname = null // Compilerfehler!\n
\n\n

Aber die reale Welt ist voller Unsicherheiten. Daten kommen aus der Datenbank, vom Benutzer, aus dem Netzwerk. Deshalb hat Kotlin nullable-Typen eingeführt — Typen, die null sein können. Sie werden mit einem Fragezeichen gekennzeichnet: String?.

\n\n
var nullableName: String? = "Bob"\nnullableName = null // Jetzt ist es erlaubt\n
\n\n

Und hier beginnt die Magie. Sie können nicht einfach eine Methode einer nullable-Variable aufrufen:

\n\n
val length = nullableName.length // Fehler! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n
\n\n

Kotlin zwingt Sie, null zu behandeln. Das ist genial — Sie vergessen nicht, es zu überprüfen. Aber manchmal wissen Sie genau, dass der Wert nicht null ist. Und hier kommt der Doppel-Ausrufezeichen-Operator in Kotlin ins Spiel.

\n\n

Was ist der !!-Operator (double bang)?

\n\n

Der !!-Operator in Kotlin ist der Non-Null-Assertions-Operator. Er nimmt einen nullable-Wert und wandelt ihn in einen non-null Typ um. Wenn der Wert null ist, wird eine KotlinNullPointerException ausgelöst.

\n\n

Syntax: Zwei Ausrufezeichen nach der Variable:

\n\n
val nonNullValue = nullableValue!!
\n\n

Wie es an einem Beispiel funktioniert

\n\n

Stellen Sie sich vor, Sie haben eine Funktion, die einen Benutzer anhand seiner ID sucht. Sie gibt User? zurück, weil der Benutzer möglicherweise nicht existiert. Aber Sie wissen genau, dass in Ihrer Testumgebung ein Benutzer mit der ID 1 existiert.

\n\n
data class User(val name: String)\n\nfun findUser(id: Int): User? {\n    // Eine Suchlogik\n    return if (id == 1) User("Anna") else null\n}\n\nfun main() {\n    val user = findUser(1)\n    // Wir sind sicher, dass user nicht null ist\n    val userName = user!!.name\n    println(userName) // Gibt aus: Anna\n}\n
\n\n

In diesem Beispiel hat double bang Kotlin korrekt funktioniert, und wir haben den Namen erhalten. Aber wenn die ID 2 gewesen wäre, wäre die Anwendung mit einer Exception abgestürzt.

\n\n

Wann man !! verwenden sollte (und wann auf keinen Fall)

\n\n

Der !!-Operator (double bang) ist wie ein roter Knopf. Man kann ihn drücken, aber nur wenn man zu 146% sicher ist. Lassen Sie uns legitime Szenarien durchgehen.

\n\n

Wann man !! verwenden kann (und sollte)

\n\n
    \n
  1. Interaktion mit Java-Code. Java kennt keine nullable-Annotationen. Wenn eine Java-Methode ein Objekt zurückgibt, sieht Kotlin es als Platform Type (z.B. String!). Sie können damit umgehen, wie Sie möchten. Aber e

Blogs

Buchempfehlungen