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") } 
  • Afirmación no nula de Kotlin en nulo
  • Cómo establecer la propiedad de Kotlin tardía en nulo
  • Error de compilation de la llamada insegura de Kotlin en un receptor nulo después de un control nulo
  • Cómo hacer comprobaciones nulas con las funciones de extensión de Kotlin en una actividad de Android
  • Kotlin null-check error
  • ¿Cómo definir un miembro delegado que se puede anotar en Kotlin?
  • ¿Cómo probar idiomáticamente cadenas no nulas y no vacías en Kotlin?
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • Kotlin comtesting null dos veces en caso de que no
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • Kotlin security nula?