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

  • Kotlin Elimina todos los caracteres no alfanuméricos
  • Tipo de parámetro Kotlin no coincide
  • Fondo de relleno de Android AlertDialog
  • ¿Cuál es la diferencia entre arrayListOf y mutableListOf, cuál es mejor?
  • Obteniendo exception de retrofit El tipo de retorno de método no debe include una variable de tipo o comodín en kotlin
  • Crea controles dinámicamente en Android usando Kotlin
  • Kotlin RC NoClassDefFoundError
  • La class Kotlin Custom View implementa una interfaz que no se puede resolver en `: app: compileDebugKotlinAfterJava`. La versión idéntica de Java funciona bien
  • Kotlinx no puede resolver el símbolo "sintético"
  • Error de puntero nulo al hacer reference a RecyclerView en un fragment con Kotlin
  • Error: ejecución fallida para la tarea ': aplicación: limpiar'. No se puede borrar el file