java - 即使返回的 ArrayList 不为空,广度优先搜索也会返回空异常指针

标签 java nullpointerexception breadth-first-search

在评分器的测试用例中,该用例说明了 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一定在“some code”部分,即:

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时。

关于java - 即使返回的 ArrayList 不为空,广度优先搜索也会返回空异常指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59126665/

相关文章:

java - php 和 jsp 中的 session ID

java - windows下如何将FormatMessage输出转换为JNI中的Java异常消息?

从抽象类调用时出现 Java NullPointerException

algorithm - 图与 BFS 和 DFS 树的等价性

Java - 保存到txt文件重复第一个条目

java - 两个JFrame的问题

java - 在 Android 的 Toast 消息中打印 StringArray[] 时出现 NullPointerException

java - "java.lang.NullPointerException: Attempt to invoke virtual method ' .. .' on a null object reference"是什么意思,如何解决?

java - HashSet 包含对象的副本

breadth-first-search - 使用邻接矩阵表示的广度优先搜索的时间复杂度?