我一直在编写HashTable作为作业,我已经接受了测试来运行和通过。
截至目前,我已经将所有测试从3分开。但据我自己的测试可以看出,所有方法都可以正常工作。除了我remove()
方法的例外情况。
public void remove(String key) throws MapException{
int i = this.linearProbing(key);
if(hashTable[i].getKey() == key){ //line 76
numberOfEntries--;
numberOfRemovals++;
hashTable[i] = this.DEFUNCT;
}
else{
String e = "No entry of this key found";
throw new MapException(e);
}
}
当我运行此测试时,我收到错误,我不确定它是什么。
//Remove a non-existent entry. Should throw an Exception
private static boolean test4() throws MapException {
StringHashCode sHC = new StringHashCode();
float maxLF = (float) 0.5;
HashTableMap h = new HashTableMap(sHC,maxLF);
try {
h.insert("R3C1");
} catch (MapException e1) {
return false;
}
try {
h.remove("R6C8"); //line 117
return false;
} catch (MapException e) {
return true; }
}
我还会在这里链接我的MapException类:
import java.lang.Exception;
public class MapException extends Exception {
public MapException(){
}
public MapException(String exception){
super(exception);
}
public MapException(String exception, Throwable throwable) {
super(exception, throwable);
}
public MapException(Throwable throwable) {
super(throwable);
}
}
错误是:
线程“main”中的异常***测试1失败测试2成功测试3在TestHashTableMap的TestHashTableMap.test4(TestHashTableMap.java:117)的HashTableMap.remove(HashTableMap.java:73)上成功执行java.lang.NullPointerException 。主要(TestHashTableMap.java:24)
答案 0 :(得分:0)
Exception in thread "main" ***Test 1 failed Test 2 succeeded Test 3 succeeded
java.lang.NullPointerException
at HashTableMap.remove(HashTableMap.java:73)
at TestHashTableMap.test4(TestHashTableMap.java:117)
at TestHashTableMap.main(TestHashTableMap.java:24)
NullPointerException通常意味着您正在尝试访问一个实际上不存在的对象(或者是Null)。
使用您在问题中添加的行号是明确的 - remove()检查
hashTable[i].getKey() == key
hashtable [i]返回Null,因此getKey失败,抛出空引用错误。
尝试:
...
public void remove(String key) throws MapException{
int i = this.linearProbing(key);
(hash) entry = hashTable[i];
if((entry !=null) && (entry == key)){
numberOfEntries--;
...
这将在操作之前检查表中是否存在该条目。