public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedHashSet<Integer> a=new LinkedHashSet<Integer>();
a.add(1);
a.add(5);
a.add(3);
a.add(6);
a.add(15);
a.add(9);

int b=11;
    PriorityQueue<Integer> one=new PriorityQueue<Integer>(a);
System.out.print(one);
 one.offer(2);
for(int i=0;i<n;i++)
{System.out.print(one.poll());
  one.remove();
  }
}
[1, 5, 3, 6, 15, 9]7
1
5
2
6
15
9
3
13615Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractQueue.remove(Unknown Source)
at PriorityqueueDemo.main(PriorityqueueDemo.java:30)
如果最后的for中不用poll()方法,用Queue中的peek()还是element()方法,就不会有exception

解决方案 »

  1.   

    Exception在线程“主要” java.util.NoSuchElementException 在java.util.AbstractQueue.remove (未知源) 在PriorityqueueDemo.main ( PriorityqueueDemo.java : 30 )
    感觉是用element()方法,
      

  2.   

    虽然看api里remove()和poll()的doc是一样的,都是返回队列头部的元素并remove,
    但jdk中PriorityQueue的remove()和poll()的实现不一样,应该用poll不用remove,否则会违反队列的性质。
    有空可以去看src研究下
      

  3.   

    如果最后的for中不用poll()方法,用Queue中的peek()还是element()方法,就不会有exception因为peek()和element()都是只获取不移除而poll()是获取并移除如果指针已经移到最后一个,并被poll()获取并移除了,后面的remove()再移除的时候这个Queue就已经是空的了,所以会抛出异常也是这个原因,楼主打印的结果也是打印一个跳过一个