首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedList.pollLast()抛出NullPointerException

LinkedList.pollLast()抛出NullPointerException
EN

Stack Overflow用户
提问于 2011-04-21 10:56:17
回答 3查看 1.4K关注 0票数 0

我使用Java 6集合API。我需要一个集合,应该只有N个元素。我的意思是,如果我添加了新元素,并且集合中已经有N个元素,那么应该删除最后一个元素,并在集合的头部添加新元素。我有下面的代码片段来完成它:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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。

同时,元素的添加也是同步的。

有人知道例外的原因是什么吗?

谢谢你的建议

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-21 11:18:11

我想系统化是在错误的对象上完成的!应该是dq,而不是o

代码语言:javascript
复制
... synchronized (dg) { ...
票数 3
EN

Stack Overflow用户

发布于 2011-04-21 11:24:05

我使用下面的测试运行了您的代码添加

代码语言:javascript
复制
    A a = new A();
    for (int i = 0; i < 200; i++)
    {
        a.add(i);
    }
    System.out.println(a.dq);

而且一切似乎都是正确的。当您得到NPE时,您能提供更多关于应用程序状态的详细信息吗?您要添加的对象是什么?当时排队的状态是什么?

还有,你说过

如果我添加了新元素,集合中已经有N个元素,则应该删除最后一个元素,并在集合的头部添加新元素

你的代码不会那么做的。现在,它增加了集合的尾部。若要将其添加到头部,请更改

代码语言:javascript
复制
dq.add(o)

代码语言:javascript
复制
dq.addFirst(o)
票数 1
EN

Stack Overflow用户

发布于 2011-04-21 11:15:32

这个javadoc,它说

代码语言:javascript
复制
 Removes and returns the last element from this list.

首先,它删除对象,所以如果它是空的,那么抛出NullPointerException:

所以让add(..)方法在dq.pollLast();之前同步并检查大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5743136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档