[英]Null Pointer Exception working with 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)
}
類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")
}
當我運行程序並嘗試使用“定義”功能時,出現以下錯誤:
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”,我不知道如何避免空指針異常。
if(kindCounter[kind]==0){
kindCounter[kind]=0
}
這沒有多大意義:您測試值是否為0,如果為0,則將其設置為0。因此,它基本上是noop。
您想要測試值是否為空:
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")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.