2012-10-16 95 views
0

我想用哈希表實現一個字典(不使用Java提供的哈希表類,而是從頭開始)。下面是我的Dictionary類的find()方法,用於檢測插入/移除時表中是否存在鍵。如果鍵已經在表中,則返回與鍵相關聯的分數(表中的元素作爲鍵/分值插入到每個表位置中的LinkedLists中)。如果不是,則返回-1。爲什麼這個數組給出一個空指針異常?

我正在運行一個提供的測試程序來確定我的Dictionary類是否工作,但在達到某個點時遇到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]進行的檢查僅檢查該對象是否爲空。調用peek()會檢查列表的頭部,如果列表爲空,則爲null。 –

相關問題