由于某种原因,我的插入函数一直返回null并打印出"not found"。我觉得这与头部为空并且不被分配为新节点的事实有关。但是我不能在findKey中这样做,因为它是一个私有类:
// findKey()
// returns a reference to the Node at key in the LinkedList; otherwise returns null
private Node findKey(String key){
Node N = head;
while(N != null){
N = N.next;
if(N.key.equals(key) && N.key != null){
return N;
}
}
return null;
}
public String lookup(String key){
if(findKey(key) == null){
System.out.println("not found");
return null;
}else{
Node N = findKey(key);
return N.value;
}
}
public void insert(String key, String value)
throws KeyCollisionException{
if(lookup(key)!= null ){
throw new KeyCollisionException(
"cannot create duplicate key");
}
if(head == null){
head = new Node(key,value);
return;
}else{
Node iter = head;
while(iter.next != null){
iter = iter.next;
}
Node N = new Node(key,value);
iter.next = N;
numItems++;
}
}
您过早地移动到findKey
的下一个节点,这意味着您将永远不会检查head
节点,看看它是否包含所需的键,如果没有找到键,您将获得NullPointerExceptions
把N = N.next;
线往下移一点。此外,在if
语句中交换检查的顺序(尽管您的Node
构造函数应该防止空键):
private Node findKey(String key){
Node N = head;
while(N != null){
if(N.key != null && N.key.equals(key)){
return N;
}
N = N.next;
}
return null;
}
你应该在构造函数中使用this关键字:
Node(String key, String value){
while(key != null && value !=null){
this.key = key;
this.value = value;
next = null;
}
和"while"是不必要的。用"if"比较好
有几个问题可能导致您的问题。首先,因为对类的字段和构造函数的参数使用相同的变量名,所以应该使用this
关键字来区分这两者。此外,您应该将while循环更改为if语句,因为您没有遍历任何内容。如果If语句失败,您应该设置一些默认值或抛出NullPointerException
。变化:
String key;
String value;
Node(String key, String value) {
while(key != null && value != null) {
key = key;
value = value;
}
}
String key;
String value;
Node(String key, String value) {
if(key != null && value != null) {
this.key = key;
this.value = value;
}
else {
throw new NullPointerException("Initial values cannot be null");
}
}
其次,你有
if(lookup(key) != null ) {
throw new KeyCollisionException("cannot create duplicate key");
}
if(head == null) {
head = new Node(key,value);
...
}
如果head
为null,则将其设置为新节点是很好的,但是在进行方法调用之后,您将设置为新节点,这将导致head
在findKey()
内部被引用。您应该切换这些操作的顺序,以防止您的NullPointerException
.
if(head == null) {
head = new Node(key,value);
...
}
if(lookup(key) != null ) {
throw new KeyCollisionException("cannot create duplicate key");
}