2017-06-27 7 views
2

Als Kotlin haben die Nicht-Null-Behauptung, ich einige lustige Sachen gefunden ...Kotlin Nicht-Null-Behauptung auf null

val myvar: String = null!! 

Es abstürzen.

Aber der Punkt ist, es überprüft nicht zur Kompilierzeit.

Die App wird zur Laufzeit abstürzen.

Sollte es Kompilierzeitfehler nicht werfen?

+0

Und deine Frage ist? – tyczj

+0

Sollte es nicht einen Kompilierzeitfehler werfen? – RBK

+0

FYI: IntelliJ IDEA markiert 'val myvar: String =' mit einer Warnung: "Unreachable code". – mfulton26

Antwort

6

!! wird zur Laufzeit ausgewertet, es ist nur ein Operator.

Der Ausdruck (x!!)

  • wirft ein KotlinNullPointerException wenn x == null,
  • Andernfalls es x Guss zu dem entsprechenden nicht-NULL festlegbaren Typ zurückgibt (beispielsweise es gibt ihn als String wenn sie auf einer Variable namens mit Typ String?).

Dies macht natürlich null!! Kurzschrift für throw KotlinNullPointerException().


Wenn es hilft, kann man sich vorstellen !! als das gleiche zu tun wie eine Funktion wie folgt funktioniert:

fun <T> T?.toNonNullable() : T { 
    if(this == null) { 
     throw KotlinNullPointerException() 
    } 
    return this as T // this would actually get smart cast, but this 
        // explicit cast demonstrates the point better 
} 

So x!! tun Sie würde das gleiche Ergebnis wie x.toNonNullable().

Verwandte Themen