【问题标题】:NullPointerException error when unit testing单元测试时出现 NullPointerException 错误
【发布时间】:2021-01-25 20:32:09
【问题描述】:

当我对我的MyStack 类的poppeek 方法进行单元测试时,我遇到了一个与我的节点类的getData 方法相关的NullPointerException

我不知道为什么,我想知道是否有人对如何修复它有任何想法并使其没有NullPointerException。我尝试编辑节点的工作方式以及getData 本身的工作方式,但找不到解决方案,因此无法找出问题所在。任何帮助将不胜感激

import java.io.*; 
import java.util.*;

public class MyStack<E> implements StackInterface<E>
{
    public Node<E> head;
    public int nodeCount = 0;

    public static void main(String args[]) {
    }

    public E peek() {
        return head.getData();
    }

    public E pop() {
        if (nodeCount == 0) {
            throw new EmptyStackException();
        }
        E item = head.getData();
        head = head.getNext();
        nodeCount--;
        return item;
    }

    public boolean empty() {
        if (head == null && nodeCount == 0) {
            return true;
        } else {
            return false;
        }
    }
    
    public void push(E data) {
        Node<E> head = new Node<E>(data);
        nodeCount++;
    }

    public int search(Object o) {
        int count = 0;
        Node<E> current = new Node<E>(head.getData());
        while (current.getData() != o) {
            current.getNext();
            count++;
        }
        return count;
    }
}

public class Node<E> 
{
    public E data;
    public Node<E> next;
    // getters and setters  
    public Node(E data) 
    { 
        this.data = data; 
        this.next = null; 
    } 
    public E getData() {
        return this.data;
    }
    public void setData(E data) {
        this.data = data;
    }
    public Node<E> getNext() {
        return next;
    }
    public void setNext(Node<E> next) {
        this.next = next;
    }
}

【问题讨论】:

    标签: java nullpointerexception stack nodes


    【解决方案1】:

    一个问题在于您的push 方法。在那里,您没有将新的 head 分配给在类级别定义的成员变量。更新后的 push 方法可能如下所示:

    public void push(E data) {
        Node<E> newHead = new Node<>(data);
        newHead.setNext(head);
        head = newHead;
        nodeCount++;
    }
    

    peek 中,您应该在尝试访问getData() 之前检查堆栈是否为空:

    public E peek() {
        if (empty()) {
            throw new EmptyStackException();
        }
        return head.getData();
    }
    

    另一个NullPointerException 发生在search 方法中,其中head.getData()null 用于空堆栈。此外,此方法不会报告堆栈中项目的正确位置。由于您已经询问过separate question,因此我不会在此答案中详细说明。


    我强烈建议您研究如何使用调试器来单步调试您的代码。因此,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。调试是程序员的一项基本技能。以下是三个资源:

    【讨论】:

    • 这不是唯一的问题。
    • @StephenC 是的,你是对的。我相应地更新了答案。
    • search初始化current的方式是错误的。我认为我们最好将 OP 指向学习调试程序的资源......
    • @StephenC 谢谢,我添加了这个我觉得很有价值的建议。 OP 已经针对 search 方法提出了一个单独的问题(现在在我的答案中链接)。这就是为什么我不在这里详细介绍的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2017-07-21
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多