ADT函数一直返回null,我不知道为什么



由于某种原因,我的插入函数一直返回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,则将其设置为新节点是很好的,但是在进行方法调用之后,您将设置为新节点,这将导致headfindKey()内部被引用。您应该切换这些操作的顺序,以防止您的NullPointerException .

if(head == null) {
    head = new Node(key,value);
    ...
}
if(lookup(key) != null ) {
    throw new KeyCollisionException("cannot create duplicate key");
}

相关内容

  • 没有找到相关文章

最新更新