空指针异常,但变量包含值



这段代码在线程"main" java.lang.NullPointerException中给了我一个异常。异常发生在代码底部的if语句处。

    public boolean printEmployees(Node Head){
    boolean isSuccessful = true;
    Node nodeChecker = new Node();
    nodeChecker = Head;
    int hospitalEmployeeCount = 0;
    int doctorCount = 0;
    int surgeonCount = 0;
    int nurseCount = 0;
    int administratorCount = 0;
    int receptionistCount = 0;
    int janitorCount = 0;
    System.out.println(nodeChecker.getData().getRole());
    while(nodeChecker != null){
        if(nodeChecker.getData().getRole() == "h")
            hospitalEmployeeCount++;

另一段代码从文件中读取数据并填充链表。我已经检查了使用断点和链表在那里。nodeChecker指向链表的头部,当我调用System.out.println语句时,它打印h。我不知道为什么异常一直发生。

在这个方法的后面,我尝试打印以显示链表中的所有信息。我试着注释掉这段代码来测试剩下的代码,但是它打印出来的时候好像链表是空的。我可以检查链表中的变量,一直到函数的末尾,它会在正确的位置显示数据,并在列表中显示正确的变量

nodeChecker不是null, nodeChecker.getData()null, String比较错误

代码底部的whileif语句需要修复。

看看你的while循环,只要nodeChecker != null的值为true,它就会一直循环下去。然而,在你的循环中没有改变它的值,所以它的值总是为true,这可能会导致一些问题。

在底部,在"if"语句中,有四个可能为空的东西:nodeChecker, getData(), getRole()或"h"。

既然你在循环中,我们已经知道nodeChecker不为空。h不是零值。如果getRole()为null,则不会出现异常,因为null == "h"将直接求值为false。

因此,通过排除,getData()必须求值为null。

有几种方法可以解决这个问题。一种简单的方法是在if语句中添加一个额外的术语,如下所示:

Data data = nodeChecker.getData();
if (data != null && data.getRole().equals("h")

这是在利用http://en.wikipedia.org/wiki/Short-circuit_evaluation。基本上,如果data == null,则if语句的LHS将计算为false。由于这是一个"and"语句,由于LHS为假,因此该语句不可能等于真,因此RHS不会费心去求值。如果data != null,则LHS将等于true,并计算RHS。这可以防止在null对象上调用getRole()方法而产生的null异常。

另外,请确保使用.equals()检查字符串的相等性,因为"=="检查引用的相等性,而".equals()"检查值的相等性。

最新更新