我使用Java 6 Collecetions API。我需要一个应该只有N个元素的集合。我的意思是,如果我添加新的元素并且集合已经有N个元素,那么最后一个元素应该被删除,并且新的元素将添加到集合的头部。我有以下代码片段来做到这一点:LinkedList.pollLast()抛出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);
}
}
与类型A的对象可以在同一时间访问许多用户添加新元素。在实践中我得到NullPointerException异常与它:
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)
Deque.pollLast()的合同并没有说明任何的NullPointerException:
获取并移除此列表的最后一个元素 ,或返回null如果这个 列表是空的。
同步添加元素。
有谁知道异常的原因是什么?
感谢您的任何想法
你应该一个共同的对象上进行同步(即列表,'this'或一些特殊的锁定对象),而不是在参数。不知道这是否会导致你的问题。 – 2011-04-21 10:59:31
是你使用的代码吗?如果是这样,你运行哪种语言? 'Dequeu'没有公共领域'大小',你可以像这样访问。 – 2011-04-21 11:01:53
@user:这是一种方法,你可以不用'()'来访问它。我知道这可能是一个错字,但这意味着您向我们显示的代码是**而不是代码有问题。请制作[SSCCE](http://sscce.org/)。 – 2011-04-21 11:04:35