2012-10-16 3 views
0

해시 테이블을 사용하여 사전을 구현하려고합니다. Java 제공 해시 테이블 클래스를 사용하지 않고 처음부터 작성했습니다. 다음은 삽입/제거 할 때 키가 테이블에 있는지 여부를 감지하는 데 사용되는 My Dictionary 클래스의 find() 메서드입니다. 키가 이미 표에있는 경우 키와 관련된 점수를 반환합니다 (표의 요소는 각 표 위치의 LinkedLists에 키/점수 쌍으로 삽입됩니다). 그렇지 않으면 -1을 반환합니다.이 배열이 널 포인터 예외를주는 이유는 무엇입니까?

내 사전 클래스가 작동하는지 확인하기 위해 제공된 테스트 프로그램을 실행하고 있지만 특정 지점에 도달하면 NullPointerException이 발생합니다. 아래에는 특정 테스트가 포함되어 있습니다. 이 예외가 왜 나오겠습니까? (필요한 경우 나는 더 많은 코드를 제공 할 수 있습니다!)

찾기 :

public int find(String config) { 
    for (int i = 0; i < dictSize; i++) { 
     if (dict[i] != null) { 
      LinkedList<DictEntry> current = dict[i]; 
      String currentConfig = current.peek().getConfig(); //Dictionary.java:66 

      if (currentConfig.equals(config)) { 
       int currentScore = current.peek().getScore(); 
       return currentScore; 
      } 
     } 
    } 

    return -1; 
} 

삽입 :

public int insert(DictEntry pair) throws DictionaryException { 
    String entryConfig = pair.getConfig(); 
    int found = find(entryConfig); //Dictionary.java:27 

    if (found != -1) { 
     throw new DictionaryException("Pair already in dictionary."); 
    } 

    int entryPosition = hash(entryConfig); 

    if (dict[entryPosition] == null) { //Dictionary.java:35 
     LinkedList<DictEntry> list = new LinkedList<DictEntry>(); 
     dict[entryPosition] = list; 
     list.add(pair); 
     return 0; 
    } else { 
     LinkedList<DictEntry> list = dict[entryPosition]; 
     list.addLast(pair); 
     return 1; 
    } 
} 

테스트 :

// Test 7: insert 10000 different values into the Dictionary 
     // NOTE: Dictionary is of size 9901 
    try { 
     for (int i = 0; i < 10000; ++i) { 
      s = (new Integer(i)).toString(); 
      for (int j = 0; j < 5; ++j) s += s; 
      collisions += dict.insert(new DictEntry(s,i)); //TestDict.java:69 
     } 
     System.out.println(" Test 7 succeeded"); 
    } catch (DictionaryException e) { 
     System.out.println("***Test 7 failed"); 
    } 

예외 스택 추적 :

Exception in thread "main" java.lang.NullPointerException 
    at Dictionary.find(Dictionary.java:66) 
    at Dictionary.insert(Dictionary.java:27) 
    at TestDict.main(TestDict.java:69) 
+1

예외 스택 추적도 게시하십시오. – sakthisundar

+0

및 삽입 방법 코드 – zaffargachal

+0

'dict'이란 무엇입니까? –

답변

5

peek()은 null을 반환합니다. getConfig() 호출 전에 무효 검사를 수행 할 수 있습니다.

+0

'if (dict [i]! = null)'검사가 충분하지 않습니까? 'getConfig()'에 대해서만 두 번째 검사를해야합니까? – user41419

+0

문자열 바꾸기 currentConfig = current.peek(). getConfig(); DictEntry에 의해 entry = current.peek(); if (entry! = null) {String currentConfig = entry.getConfig(); ...} – Aubin

+0

정확히 @Aubin, 감사합니다. dict [i]로 작성한 점검은 해당 오브젝트가 널 (null)인지 점검합니다. peek()을 호출하면 목록의 머리글을 검사하고 목록이 비어 있으면 null을 반환합니다. –