Исключение итерации LinkedList - PullRequest
1 голос
/ 10 марта 2011

Я борюсь с этой ошибкой. Я чувствую, что это действительно просто, но не могу понять, почему я получаю ошибку.

Я получаю 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;
            }
        }
    }
}

Ошибка в этой строке:

* * 1010

Пожалуйста, помогите. Мое назначение неверно в любом случае ??? Пожалуйста помоги!!! Спасибо

Ответы [ 7 ]

0 голосов
/ 10 марта 2011

Было бы хорошо, если бы вы могли добавить точку отладки перед этой строкой и посмотреть, какая переменная равна нулю. глядя на код, ответ: 1. order is null 2. order.getOrderID () равен null или 3. im равен null

0 голосов
/ 10 марта 2011

Небольшое изменение вашего кода сделает его длиннее, но гораздо проще найти ошибку ... вместо того, чтобы делать:

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

Измените его на:

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

if(orderID.equals(imOrderID()) {

ТогдаВы будете знать, является ли order или im нулевым.Если ни один из них не имеет значения null, то значениями, которые могут быть нулевыми, являются orderID и imOrderID.Теперь просто выяснить, какой из них имеет значение null.

Если это порядок или im, то программа завершится сбоем в строках order.getOrderID() или im.getOrderID().

Если вместо этого orderID или imOrderID равен нулю, то произойдет сбой if(orderID.equals(imOrderID()) {.Затем вы можете использовать System.out.println (или что-то лучше, например, отладчик), чтобы легко выяснить, что не так.

Если ни один из них не должен быть нулевым, тогда я предлагаю добавить что-то вроде:

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

, а затем отследите, как для него было установлено значение null.

0 голосов
/ 10 марта 2011

Либо im имеет значение null, либо order.getOrderID () возвращает значение null.

0 голосов
/ 10 марта 2011

Не похоже, что я когда-либо объявлен / назначен.Так что

im.getOrderID()

, вероятно, где генерируется исключение нулевого указателя.

- Dan

Редактировать:

Пропущено, что im передается какАргумент.Таким образом, остается несколько возможностей (в порядке вероятности):

  1. im имеет значение null (то есть вызываемая пользователем функция с нулевым параметром)
  2. order.getOrderID () возвращает значение null
  3. порядок равен нулю (т. Е. В списке есть нулевые значения)

Edit2:

Ваша строка

if (modify = true)

в корне неверна ивсегда будет иметь значение true (одиночное равенство для назначения, == для сравнения.)

При простой проверке, является ли флаг логическим значением true или false, лучше всего использовать:

boolean flag = true;

if(flag)
{
    // True block
}
else
{
   // False block
}
0 голосов
/ 10 марта 2011

Один первый взгляд, где создается экземпляр im? Вы также можете попробовать отладить в вашей IDE, чтобы увидеть, что происходит?

0 голосов
/ 10 марта 2011

Вы никогда не проверяете, является ли im нулевым. Я подозреваю, что это так.

0 голосов
/ 10 марта 2011

Полагаю, вы передаете ноль в im. Мне нужно увидеть больше кода, чтобы быть уверенным.

...