Android的Queue poll()调用抛出NoSuchElementException

时间:2014-03-04 09:13:33

标签: android exception queue nosuchelementexception

  

我有一个队列实现。要执行解除队列,我使用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(){}
  

这就是我出队的方式。这是在不同的类文件中。这是用于在文本视图中显示数据的另一个线程。

2 个答案:

答案 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方法。而且你的问题中的问题是队列是空的,所以要确保你正确排队数据