La diferencia entre !! y? en Kotlin

Soy nuevo en Kotlin . ¡Quiero saber la diferencia entre estos dos !! y ? en el siguiente código.

Estoy teniendo el siguiente fragment de dos primero teniendo uso de !! para mCurrentDataset y otro tener ? para la misma variable.

 if(!mCurrentDataset!!.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE)) { Log.d("MyActivity","Failed to load data.") return false } 

 if(!mCurrentDataset?.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE)!!) { Log.d("MyActivity","Failed to load data.") return false } 

Gracias por adelantado.

Como decía en la reference de Kotlin , !! es una opción para los amantes de NPE 🙂

 a!!.length 

devolverá un valor no nulo de a.length o arrojará una NullPointerException si a es null :

 val a: String? = null print(a!!.length) // >>> NPE: trying to get length of null 

 a?.length 

devuelve a.length si a no es null , y null caso contrario:

 val a: String? = null print(a?.length) // >>> null is printed in the console 

Para resumir:

 +------------+--------------------+---------------------+----------------------+ | a: String? | a.length | a?.length | a!!.length | +------------+--------------------+---------------------+----------------------+ | "cat" | Compile time error | 3 | 3 | | null | Compile time error | null | NullPointerException | +------------+--------------------+---------------------+----------------------+ 

Podría ser útil: ¿Qué es una NullPointerException?

la precedencia de los operadores ! , ?. , !! es ?. > !! > ! .

el !! el operador levantará KotlinNullPointerException cuando opera en una reference null , por ejemplo:

 null!!;// raise NullPointerException 

la llamada segura ?. el operador devolverá null cuando opere con una reference null , por ejemplo:

 (null as? String)?.length; // return null; 

el !! el operador en su segundo acercamiento puede elevar NullPointerException si el lado izquierdo es null , por ejemplo:

 mCurrentDataset?.load(..)!! ^-------------^ | when mCurrentDataset== null || load() == null a NullPointerException raised. 

puede usar el operador elvis ?: lugar de la !! operador en su caso, por ejemplo:

 !(mCurrentDataset?.load(..)?:false) 

esto es '!!' El operador double-bang siempre devuelve valor no nulo y esto es '?' operador de llamada segura devuelve valor si el valor no es nulo, y nulo de lo contrario

Esta es una conversión insegura de tipo anulable (T?) A un tipo no anulable (T). Lanzará NullPointerException si el valor es nulo.

Está documentado aquí junto con los medios de security nula de Kotlin.

ref – tecla de acceso rápido

  • Extensión sintética Kotlin para ver
  • Dagger2 inyecta un presentador en un error de actividad de Kotlin
  • extracción de resources de string para kotlin en android studio?
  • cant en variable de llamada en android studio
  • Extienda la comprobación de Mockito para que Kotlin no funcione (de manera "kotlin")
  • ¿Por qué la configuration de OnClickListener funciona una vez?
  • Extensión de Kotlin Any? .toString ()
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • registerReceiver () muestra error por método sobrecargado
  • Diseño inflado por progtwigción con las extensiones de Kotlin para Android
  • Cómo pasar los valores de actividad a otra actividad en kotlin