Исключение Null Pointer, работающее с Map (Kotlin)

У меня есть следующий класс:

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) } 

class Entry выглядит так:

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

Главный:

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

Когда я запускаю программу и пытаюсь использовать функцию «define», я получаю следующую ошибку:

 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) 

Я предполагаю, что проблема связана с тем, как я создаю новый класс symbolTable, но, видя, что у Kotlin нет «нового», я не знаю, как избежать исключения нулевого указателя.

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

Это не имеет большого значения: вы проверяете, равно ли значение 0, и если это так, вы устанавливаете значение 0. Таким образом, это в основном нооп.

Вы хотите проверить, имеет ли значение значение null:

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

Вы также можете избежать использования опасного !! оператор, сохраняя значение в переменной.

И вы действительно должны использовать val, а не var: все ваши поля не должны изменяться:

 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") }