我有一个队列实现。要执行解除队列,我使用poll()API 删除头部,但它会抛出NoSuchElementException 不应该。谁能解释我为什么会这样?我的队列有多个 足够的数据可以排队。
protected boolean enQueue(ByteBuffer data){
if (queue.offer(data)){
return true;
}else {
return false;
}
}
protected ByteBuffer deQueue(){
ByteBuffer data = null;
try{
if(getQueueCount() > 0)
{
data = queue.poll();
if(data != null){
return data;
}else {
return null;
}
}
else{
return null;
}
}
catch(NoSuchElementException e){
e.printStackTrace();
return null;
}
}
修改
java.util.Queue<ByteBuffer> queue;
public Queue(){
queue = new LinkedList<ByteBuffer>();
}
protected int getQueueCount(){
return queue.size();
}
堆栈跟踪:
03-04 14:58:50.205:W / System.err(7937):java.util.NoSuchElementException 03-04 14:58:50.205:W / System.err(7937):at java.util.LinkedList.removeFirstImpl(LinkedList.java:689) 03-04 14:58:50.205:W / System.err(7937):at java.util.LinkedList.removeFirst(LinkedList.java:676) 03-04 14:58:50.205:W / System.err(7937):at java.util.LinkedList.poll(LinkedList.java:895) 03-04 14:58:50.205:W / System.err(7937):at com.android.testapp.Queue.deQueue(Queue.java:37) 03-04 14:58:50.205:W / System.err(7937):at com.android.testapp.DisplayData.run(LogViewActivity.java:1164)
编辑2:
ENQUEUE
Queue.getInstance().enQueue(tempByteBufRead);
这用于将通过蓝牙接收的数据排入bluetooth.class。 tempByteBufRead是一个Bytebuffer。这是在一个单独的线程中完成的。
DEQUEUE
while( Queue.getInstance().getQueueCount() <= 0);
try {
if(LLTestAppActivity.DEBUG){
Log.d("DisplayData", "Crossed queue count...");
}
ByteBuffer tempByteBuf = Queue.getInstance().deQueue();
if(null == tempByteBuf){
Log.d("DisplayData", "No data in queue...");
}
else{
//TODO:
}
}catch(){}
这就是我出队的方式。这是在不同的类文件中。这是用于在文本视图中显示数据的另一个线程。
答案 0 :(得分:2)
您的队列为空(或者更确切地说,缺少其第一个元素)。 LinkedList中的poll方法实现如下:
public E poll() {
if (size==0)
return null;
return removeFirst();
}
和removeFirst是一个抛出NoSuchElementException的方法。
您应该尝试找出导致第一个元素丢失的原因,因为显然您的队列报告的元素数量非零。如何将对象推入队列?
编辑: 在看到您的修改后建议您更改代码:
// use a thread-safe queue implementation:
java.util.concurrent.BlockingQueue<ByteBuffer> queue;
// make the constructor private, since it's a singleton you don't want anyone else to be able to instantiate
private Queue() {
queue = new LinkedBlockingQueue<ByteBuffer>();
}
// enQueue and deQueue without a bunch of redundant code:
protected boolean enQueue(ByteBuffer data) {
return queue.offer(data);
}
protected ByteBuffer deQueue() {
return queue.take();
}
// enqueue data like this:
Queue.getInstance().enQueue(tempByteBufRead);
// and dequeue it:
try {
ByteBuffer tempButeBuf = Queue.getInstance().deQueue();
// TODO: do something useful with the buffer
} catch (InterruptedException e) {
}
答案 1 :(得分:0)
偷看:检索但不删除此队列的头部,或返回 如果此队列为空,则返回null。返回:此队列的头部,或null 如果此队列为空
投票:
检索并删除此队列的头部,或返回 如果此队列为空,则返回null。返回:此队列的头部,或null 如果此队列为空
所以你可以使用peek方法。而且你的问题中的问题是队列是空的,所以要确保你正确排队数据