Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        4个月前关闭。
                                                                                            
                
        
在针对平地机的测试案例中,案例说明了正在接收getMinLadder("aa", "aa")NullPointerException呼叫。每当我使用该方法调用运行客户端时,我都会收到正确的答案。我对调用该方法将如何导致空指针异常感到困惑。

以下是我的广度优先搜索代码。我知道这可能是一团糟,但它在所有其他情况下都有效。您是否在此摘要中看到任何可能是我未通过该测试的原因?

我的isWord()方法和getHammingDistance()方法不包括在内。他们正常工作。 isWord()只是扫描单词的哈希集,以查看它是否包含我要查找的字符串。 getHammingDistance()也非常简单。

  public List<String> getMinLadder(String start, String end) {

  start.toLowerCase();
  end.toLowerCase();
  neighbors.clear();

  minLadder = new ArrayList<String>();

  HashSet<String> visited = new HashSet<String>();

  Queue<Node<String>> queue = new ArrayDeque<Node<String>>();

  Node<String> root = new Node<String>(start);
  queue.add(root);

  Node<String> currentNode;

  if (start.equals(end)) {
     minLadder.add(start);
     return minLadder;
  }

  if (getHammingDistance(start, end) == -1) {
     return minLadder;
  }

  if (isWord(start) && isWord(end)) {

  while (!queue.isEmpty()) {
     currentNode = queue.remove();
     neighbors.addAll(this.getNeighbors(currentNode.getValue()));
     queue.removeAll(visited);

     for (String obj : neighbors) {
        if (!obj.equals(end)) {
           visited.add(obj);
           Node<String> node = new Node<String>(obj);
           queue.add(node);
           node.next = currentNode;
        }
        else {
           Node<String> lastNode = new Node<String>(obj);
           queue.add(lastNode);
           lastNode.next = currentNode;
           queue.remove();

           Node<String> pointer = new Node<String>(null);
           pointer.next = lastNode;

           while (pointer.next != null) {
              minLadder.add((String) pointer.next.getValue());
              pointer.next = pointer.next.next;
           }
           java.util.Collections.reverse(minLadder);
           return minLadder;
        }
     }
  }
 }
  return minLadder;
  }

最佳答案

对代码的分析表明,当两个参数相等时,流程结束:

public List<String> getMinLadder(String start, String end) {

// some code

if (start.equals(end)) {
    minLadder.add(start);
    return minLadder;
}


因此,NPE必须位于“某些代码”部分,即:

start.toLowerCase();
end.toLowerCase();
neighbors.clear();

minLadder = new ArrayList<String>();

HashSet<String> visited = new HashSet<String>();

Queue<Node<String>> queue = new ArrayDeque<Node<String>>();

Node<String> root = new Node<String>(start);
queue.add(root);


唯一可以导致NPE的行是:

neighbors.clear();


然后仅当neighborsnull时。

10-06 16:20
查看更多