J'utilise Java 6 Collecetions API. J'ai besoin d'une collection qui ne devrait avoir que N éléments. Je veux dire que si j'ajoute un nouvel élément et que la collection contient déjà N éléments, le dernier élément doit être supprimé et un nouveau doit être ajouté dans la tête de collection. Je suivant fragment de code pour le faire:LinkedList.pollLast() throws NullPointerException
class A {
int N = 100;
Deque dq = new LinkedList();
void add(Object o) {
synchronized (o) {
if (dq.size() == N) {
dq.pollLast();
}
dq.add(o);
}
}
Deque getDq() {
return new LinkedList(dq);
}
}
objet de type A peut être consulté de nombreux utilisateurs dans le même temps d'ajouter de nouveaux éléments. En pratique, je suis arrivé NullPointerException avec elle:
Caused by: java.lang.NullPointerException
at java.util.LinkedList.remove(LinkedList.java:790)
at java.util.LinkedList.removeLast(LinkedList.java:144)
at java.util.LinkedList.pollLast(LinkedList.java:573)
at A.add(A.java:9)
contrat Deque.pollLast() ne dit rien au sujet NullPointerException:
Rapporte et supprime le dernier élément de cette liste, ou renvoie null si cette liste est vide.
L'ajout d'éléments est également synchronisé.
Est-ce que quelqu'un sait ce que pourrait être la raison d'exception?
Merci pour toutes les idées
Vous devez synchroniser sur un objet commun (à savoir la liste, 'this' ou un objet de verrouillage spécial), et non sur le paramètre. Aucune idée si cela cause votre problème, cependant. –
Est-ce le code que vous utilisez?Si oui, dans quelle langue courez-vous? 'Dequeu' n'a pas de champ public' size' auquel vous pourriez accéder comme ça. –
@user: c'est une méthode, vous y accédez sans le '()'. Je suis conscient que c'est probablement une faute de frappe, mais cela signifie que le code que vous nous montrez n'est pas ** le code qui a le problème. S'il vous plaît produire un [SSCCE] (http://sscce.org/). –