NPE в java.util.LinkedList метод addBefore - PullRequest
3 голосов
/ 25 октября 2010

Каким-то образом я получаю исключение нулевого указателя здесь с JDK 1.6.0_14:

HttpSession session = request.getSession(true);
LinkedList<MyObject> list = (LinkedList<MyObject>) session.getAttribute(MY_LIST_KEY);
....
list.addFirst( new MyObject(str1, str2, map) );

Тогда я получаю это:

 at java.util.LinkedList.addBefore(LinkedList.java:779)

Вот метод:

private Entry<E> addBefore(E e, Entry<E> entry) {
    Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
    newEntry.previous.next = newEntry;//this line NPEs
    newEntry.next.previous = newEntry;
    size++;
    modCount++;
    return newEntry;
}

который называется

public void addFirst(E e) {
    addBefore(e, header.next);
}

Есть ли какой-нибудь странный способ, которым список можно сериализовать / десериализовать, чтобы сломать запись заголовка и вызвать это? Я не понимаю, как это может быть неудачным.

Вот методы сериализации для LinkedList

private void writeObject(java.io.ObjectOutputStream s)
    throws java.io.IOException {
    // Write out any hidden serialization magic
    s.defaultWriteObject();

    // Write out size
    s.writeInt(size);

    // Write out all elements in the proper order.
    for (Entry e = header.next; e != header; e = e.next)
        s.writeObject(e.element);
}

private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
    // Read in any hidden serialization magic
    s.defaultReadObject();

    // Read in size
    int size = s.readInt();

    // Initialize header
    header = new Entry<E>(null, null, null);
    header.next = header.previous = header;

    // Read in all elements in the proper order.
    for (int i=0; i<size; i++)
        addBefore((E)s.readObject(), header);
}

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

Мое предположение было бы неправильным разделением Списка между несколькими потоками. Я предполагаю, что список одновременно изменяется двумя разными потоками.

0 голосов
/ 25 октября 2010

Скорее всего, (LinkedList<MyObject>) session.getAttribute(MY_LIST_KEY) вернул null.
Обновление: Как правильно указано в комментариях, null не может быть возвращено здесь getAttribute(), в противном случае трассировка стека не будет указывать на внутренние элементы LinkedList. Итак, мое предложение неверно.

...