我使用Java 6集合API。我需要一个集合,应该只有N个元素。我的意思是,如果我添加了新元素,并且集合中已经有N个元素,那么应该删除最后一个元素,并在集合的头部添加新元素。我有下面的代码片段来完成它:
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。
同时,元素的添加也是同步的。
有人知道例外的原因是什么吗?
谢谢你的建议
发布于 2011-04-21 11:18:11
我想系统化是在错误的对象上完成的!应该是dq,而不是o!
... synchronized (dg) { ...发布于 2011-04-21 11:24:05
我使用下面的测试运行了您的代码添加
A a = new A();
for (int i = 0; i < 200; i++)
{
a.add(i);
}
System.out.println(a.dq);而且一切似乎都是正确的。当您得到NPE时,您能提供更多关于应用程序状态的详细信息吗?您要添加的对象是什么?当时排队的状态是什么?
还有,你说过
如果我添加了新元素,集合中已经有N个元素,则应该删除最后一个元素,并在集合的头部添加新元素
你的代码不会那么做的。现在,它增加了集合的尾部。若要将其添加到头部,请更改
dq.add(o)至
dq.addFirst(o)发布于 2011-04-21 11:15:32
见这个javadoc,它说
Removes and returns the last element from this list.首先,它删除对象,所以如果它是空的,那么抛出NullPointerException:
所以让add(..)方法在dq.pollLast();之前同步并检查大小。
https://stackoverflow.com/questions/5743136
复制相似问题