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

  • Cómo usar fragments con kotlin
  • Convierta la actividad principal con la barra de acciones / barra de herramientas y el button de acción flotante a Anko
  • Estudio de Android 3: Tiempo de ejecución de Kotlin desactualizado
  • Genéricos Java vs Kotlin
  • Extensiones de Kotlin / properties sintéticas: mismo object en múltiples invocaciones de Fragment.onViewCreated ()
  • La biblioteca de Android no puede comstackr kotlin
  • Android Kotlin Extension super calling
  • ¿Insertar o agregar un elemento en ArrayList en Kotlin?
  • "Las proyecciones no están permitidas para los arguments inmediatos de un supertipo" Kotlin Android Studio
  • ¿Para qué sirve el campo de apoyo de Kotlin?
  • UNRESOLVED_REFERENCE en widget (TextView) resuelto al elemento error en android-kotlin