Kotlin, Nulls und der doppelte Ausrufezeichen: Eine Einführung
\n\nHaben 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).
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.
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\nDas Problem, das !! löst: Null Safety in Kotlin
\n\nKotlin 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.
var name: String = "Alice"\nname = null // Compilerfehler!\n\n\nAber 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?.
var nullableName: String? = "Bob"\nnullableName = null // Jetzt ist es erlaubt\n\n\nUnd hier beginnt die Magie. Sie können nicht einfach eine Methode einer nullable-Variable aufrufen:
\n\nval length = nullableName.length // Fehler! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n\n\nKotlin 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.
Was ist der !!-Operator (double bang)?
\n\nDer !!-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.
Syntax: Zwei Ausrufezeichen nach der Variable:
\n\nval nonNullValue = nullableValue!!\n\nWie es an einem Beispiel funktioniert
\n\nStellen 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.
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\nIn 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\nWann man !! verwenden sollte (und wann auf keinen Fall)
\n\nDer !!-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\nWann man !! verwenden kann (und sollte)
\n\n- \n
- 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