Pregunta

De alguna manera, me estoy haciendo una excepción de puntero nulo aquí con 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) );

A continuación, me sale esto:

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

Aquí está el método:

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;
}

que es llamada por

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

¿Hay alguna forma extraña la lista se puede serializar / deserializar para romper la entrada de la cabecera a hacer que esto suceda? No veo cómo esto podría estar fallando.

A continuación los métodos de serialización para 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);
}
¿Fue útil?

Solución

Mi conjetura sería el intercambio inadecuado de la lista a través de múltiples hilos. Conjeturaría la lista se está modificando simultáneamente por dos hilos diferentes.

Otros consejos

La mayoría (LinkedList<MyObject>) session.getAttribute(MY_LIST_KEY) probablemente, null regresó.
Actualización: Como se ha señalado correctamente en los comentarios, null no puede ser devuelto por getAttribute() aquí, de lo contrario no lo haría StackTrace punto en partes internas de LinkedList. Por lo tanto, mi sugerencia es erróneo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top