我有一个队列实现。为了执行出队,我使用 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): 在 java.util.LinkedList.removeFirstImpl( LinkedList.java:689) 03-04 14:58:50.205: W/System.err(7937): 在 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): 在 com.android.testapp.DisplayData.run(LogViewActivity.java:1164)
编辑2:
排队
Queue.getInstance().enQueue(tempByteBufRead);
我用它来将通过蓝牙接收到的数据排入 bluetooth.class。tempByteBufRead 是一个字节缓冲区。这是在一个单独的线程中完成的。
出队
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(){}
这就是我出列的方式。这是在不同的类文件中。这是另一个用于在文本视图上显示数据的线程。