空指针异常但变量包含值

时间:2014-06-09 05:16:37

标签: java

此代码在线程" 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。我无法弄清楚为什么异常会继续发生。

稍后在此方法中,我尝试打印以筛选链接列表中的所有信息。我已经尝试注释掉这部分代码来测试剩余的代码,但是它打印出来好像链表是空的。我可以检查链表中的变量一直到函数结束,它会在正确的位置显示数据,并在列表中显示正确的变量。

2 个答案:

答案 0 :(得分:4)

nodeChecker不是nullnodeChecker.getData()null,也是String比较is done incorrectly

答案 1 :(得分:0)

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

查看你的while循环,只要nodeChecker != null的计算结果为true,它就会保持循环。但是,循环内部没有任何内容更改其值,因此它将始终评估为true,这可能会导致一些问题。

在底部,在你的"如果"声明,有四件事可能是null:nodeChecker,getData(),getRole()或" h"。

由于您处于循环中,我们已经知道nodeChecker不为null。 " 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。因为它是"和"声明,由于LHS是假的,声明不能相等,因此RHS不会费心去评估。如果data!= null,则LHS将等于true,并且将评估RHS。这可以防止在空对象上调用getRole()方法时出现的null异常。

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