LinkedList迭代异常

时间:2011-03-10 03:57:49

标签: java exception linked-list nullpointerexception

我正在努力解决这个错误。我觉得它很简单但不明白为什么会出错。

当我遍历链表中的值时,我不断获得NullPointerException

代码段:

private void updateBuyBook(LimitOrder im) {

    LimitOrder lm = null;

    Iterator itr = buyBook.entrySet().iterator();

    boolean modify = false;

    while (itr.hasNext() && !modify) {

        Map.Entry pairs = (Map.Entry) itr.next();
        if ((((LinkedList<IMessage>) pairs.getValue()).size() > 0)) {
            LinkedList<ILimitOrder> orders = (LinkedList<ILimitOrder>) pairs
                .getValue();
            ListIterator listIterator = orders.listIterator();
            while (listIterator.hasNext() && !modify) {
                LimitOrder order = (LimitOrder) listIterator.next();

                if (order.getOrderID().equalsIgnoreCase(im.getOrderID())) { // error at this line
                    lm = order;
                    addToBuyMap(im);
                    modify = true;
                    break;
                }
            }
            if (modify = true) {
                orders.remove(lm);
                break;
            }
        }
    }
}

错误就在这一行:

Exception in thread "main" java.lang.NullPointerException
order.getOrderID().equalsIgnoreCase(im.getOrderID()));

请帮忙。我的作业是否有任何错误? 请帮忙!!! 感谢

7 个答案:

答案 0 :(得分:0)

我的猜测是你传入 null,进入im。我需要查看更多代码才能确定。

答案 1 :(得分:0)

您永远不会检查im是否为空。我怀疑是。

答案 2 :(得分:0)

首先看一下,im在哪里实例化?您还可以尝试在IDE中进行调试,以便了解最新情况?

答案 3 :(得分:0)

看起来没有宣布/分配。所以

im.getOrderID()

可能是生成空指针异常的地方。

- 丹

编辑:

错过了im作为参数传递。因此留下了一些可能性(按可能性顺序):

  1. im为null(即用户称为带空参数的函数)
  2. order.getOrderID()返回null
  3. order为null(即列表中包含空值)
  4. EDIT2:

    你的行

    if (modify = true)
    

    基本上是错误的,并且总是评估为真(单个等于分配,==用于比较。)

    当简单地检查标志布尔值是真还是假时,最好使用:

    boolean flag = true;
    
    if(flag)
    {
        // True block
    }
    else
    {
       // False block
    }
    

答案 4 :(得分:0)

im为null或order.getOrderID()返回null。

答案 5 :(得分:0)

如果您可以在该行之前添加调试点并查看哪个变量为null,那将是一件好事。看代码答案是1. order是null 2. order.getOrderID()是null或3. im是null

答案 6 :(得分:0)

稍微更改代码会使代码更长,但更容易找到错误...而不是执行:

if (order.getOrderID().equalsIgnoreCase(im.getOrderID())) { 

将其更改为:

String orderID = order.getOrderID();
String imOrderID = im.getOrderID();

if(orderID.equals(imOrderID()) {

然后您将知道orderim是否为空。如果这些都不为null,则可能为null的内容为orderIDimOrderID。现在很容易找出哪一个是空的。

如果是订单或即时消息,则程序将在order.getOrderID()im.getOrderID()行崩溃。

如果orderIDimOrderID为空,则会在if(orderID.equals(imOrderID()) {上崩溃。然后,您可以使用System.out.println(或者更好的东西,比如调试器)轻松找出问题所在。

如果这些都不为null,那么我建议添加如下内容:

if(orderID == null) { throw new IllegalStateException("orderID cannot be null"); }
if(imOrderID == null) { throw new IllegalStateException("imOrderID cannot be null"); }

然后跟踪它如何设置为null开始。