2016-06-05 2 views
1

나는 다음과 같은 클래스가 :널 포인터 예외

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

홈페이지 :

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

클래스 항목은 다음과 같습니다를

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"가없는 것처럼 보입니다. 널 포인터 예외를 피하는 방법을 모릅니다.

+0

는 기존 답변을 무효화하도록 질문을 편집하지 마십시오. 대신 새로운 질문을 게시하십시오. – Matt

답변

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

값이 0인지 테스트하고, 값이 0이면 테스트를 0으로 설정합니다. 따라서 기본적으로 아무런 효과가 없습니다.

은 당신이 원하는 것은 값이 null의 경우 테스트하는 것입니다 :

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

또한 변수에 값을 저장하여 위험 !! 연산자를 사용하지 않도록 할 수있다.

그리고 당신이 정말로 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") 
} 
+0

이것은 어리석은 질문 일지 모르지만 일단 할당 된 val은 변경할 수 없으며이 프로그램에서 내지도를 변경해야한다고 생각했습니다. –

+0

지도의 ** 콘텐츠 **를 변경해야합니다. 맵의 타입이 MutableMap이기 때문에 그렇게 할 수 있습니다. 그러나지도를 다른 것으로 대체 할 필요가 없습니다. 즉,지도 변수에 새 값을 지정합니다 (예 :'map = anotherMap'). –