Question

D'une certaine façon, je reçois une exception de pointeur nul ici avec 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) );

Alors, je reçois ceci:

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

Voici la méthode:

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

qui est appelé par

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

Est-il possible bizarre la liste peut être sérialisé / désérialisé pour briser l'entrée d'en-tête pour provoquer que cela se produise? Je ne vois pas comment cela pourrait être un échec.

Voici les méthodes de sérialisation pour 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);
}
Était-ce utile?

La solution

Je pense partagerait incorrecte de la liste sur plusieurs threads. Je suppose que la liste est modifiée simultanément par deux threads différents.

Autres conseils

Très probablement, (LinkedList<MyObject>) session.getAttribute(MY_LIST_KEY) retourné null.
Mise à jour: Comme indiqué à juste dans les commentaires, null ne peut pas être retourné par getAttribute() ici, sinon stacktrace ne serait pas le point dans de LinkedList internes. Donc, ma suggestion est erronée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top