1

私は次のクラスを持っています:

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

プログラムを実行して「定義」機能を使用しようとすると、次のエラーが発生します。

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 には「new」がないため、null ポインター例外を回避する方法がわかりません。

4

1 に答える 1

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

これはあまり意味がありません。値が 0 かどうかをテストし、0 の場合は 0 に設定します。したがって、基本的にはノープです。

必要なのは、値が null かどうかをテストすることです。

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

!!値を変数に保存することで、危険な演算子の使用を避けることもできます。

そして、実際には var ではなく val を使用する必要があります: すべてのフィールドを変更可能にするべきではありません:

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")
}
于 2016-06-05T07:45:11.140 に答える