Excepción del puntero nulo trabajando con Map (Kotlin)

Tengo la siguiente class:

class SymbolTable(){ var map = mutableMapOf<String, Entry>() var kindCounter = mutableMapOf<String, Int>() fun define(name:String, kind:String, type:String){ if(kindCounter[kind]==0){ kindCounter[kind]=0 } var index = 1 map[name]= Entry(type, kind, index) kindCounter[kind]=kindCounter[kind]!!.plus(1) } 

la input de la class se ve así:

 class Entry(var type:String, var kind:String, var index:Int) 

Principal:

 fun main(args:Array<String>){ var example = SymbolTable() example.define("ex1", "ex1", "ex1") example.define("ex2", "ex2", "ex2") } 

Cuando ejecuto el progtwig y trato de utilizar la function "definir" obtengo el siguiente error:

 Exception in thread "main" kotlin.KotlinNullPointerException at SymbolTable.define(SymbolTable.kt:21) at SymbolTableKt.main(SymbolTable.kt:31) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Supongo que el problema tiene algo que ver con la forma en que creo una nueva class symbolTable, pero dado que Kotlin no tiene "nuevo", no sé cómo evitar la exception del puntero nulo.

 if(kindCounter[kind]==0){ kindCounter[kind]=0 } 

Esto no tiene mucho sentido: testing si el valor es 0, y si lo es, lo configuras en 0. Entonces, básicamente es un noop.

Lo que quiere es probar si el valor es nulo:

 if (kindCounter[kind] == null) { kindCounter[kind] = 0 } 

¡¡También podrías evitar usar el peligroso !! operador guardando el valor en una variable.

Y realmente debería usar val en lugar de var: todos sus campos no deberían ser mutables:

 class SymbolTable() { val map = mutableMapOf<String, Entry>() val kindCounter = mutableMapOf<String, Int>() fun define(name: String, kind: String, type: String) { val count = kindCounter[kind] ?: 0 map[name] = Entry(type, kind, 1) kindCounter[kind] = count + 1 } } class Entry(val type: String, val kind: String, val index: Int) fun main(args:Array<String>) { val example = SymbolTable() example.define("ex1", "ex1", "ex1") example.define("ex2", "ex2", "ex2") } 
  • Kotlin - lateinit VS Cualquiera? = nulo
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Hay alguna manera de crear una matriz no nula a partir de un range?
  • kotlin inversa boolean seguro de casting
  • Lanzamiento inteligente a kotlin.String
  • La mejor forma de comprobar null en kotlin?
  • ¿Por qué la llamada insegura .run () funciona bien en un valor nulo en Kotlin?
  • Las comprobaciones nulas no se insertan para el tipo reificado cuando param no es nulo
  • Kotlin comtesting null dos veces en caso de que no
  • ¿Cuándo debería usar let {} y cuando simplemente! = Null