繁体   English   中英

错误链表 peek() 不为 null 和 size() =0

[英]Error linkedlist peek() not null and size() =0

import java.util.LinkedList;

public LinkedList<String> mylinkedlist;

/*...*/

System.out.println("STRING: "+ mylinkedlist.peek() +" SIZE: "+ mylinkedlist.size());

输出

字符串:blablabla 大小:0

这是一个调试问题:如何peek()返回值和列表大小为 0 ?

编辑 2 月 25 日 - 错误再次出现

错误 :

java.util.NoSuchElementException
    at java.util.LinkedList.removeFirst(LinkedList.java:270)
    at java.util.LinkedList.pop(LinkedList.java:801)
    at GrblCommunicator.streamCommands(GrblCommunicator.java:164)
    at GrblCommunicator.responseMessage(GrblCommunicator.java:234)
    at ResponseMessageHandler.handleResponse(ResponseMessageHandler.java:33)
    at SerialConnectionJserial.serialEvent(SerialConnectionJserial.java:114)
    at com.fazecast.jSerialComm.SerialPort$SerialPortEventListener.waitForSerialEvent(SerialPort.java:1387)
    at com.fazecast.jSerialComm.SerialPort$SerialPortEventListener$1.run(SerialPort.java:1300)
    at java.lang.Thread.run(Thread.java:748)

编码 :

import java.util.LinkedList;

/*...*/

public volatile LinkedList<String> commandBuffer;     


public void streamCommands() {

        if (this.commandBuffer.size() == 0) {
            // NO-OP
            return;
        }

        if (this.sendPaused) {
            // Another NO-OP
            return;
        }


        while (CommUtils.checkRoomInBuffer(this.sentBufferSize, this.commandBuffer.peek())
                && allowMoreCommands()) {

            if(this.commandBuffer.size()==0) {
                System.out.println("ERROR DE COMMAND BUFFER SIZE GrblComm 155: ");
                return;
            }
            else
            {
                 String commandString = this.commandBuffer.pop();

第 164 行是:this.commandBuffer.pop();

我不明白这个错误,因为有一个 this.commandBuffer.size() 测试!!!!!!

请给我解释一下!!!

编辑 2 月 25 日

我要尝试用 ConcurrentLinkedDeque 替换 LinkedList

编辑 2 月 26 日

同样的错误:

java.util.NoSuchElementException
    at java.util.concurrent.ConcurrentLinkedDeque.screenNullResult(ConcurrentLinkedDeque.java:810)
    at java.util.concurrent.ConcurrentLinkedDeque.removeFirst(ConcurrentLinkedDeque.java:990)
    at java.util.concurrent.ConcurrentLinkedDeque.pop(ConcurrentLinkedDeque.java:1036)
    at GrblCommunicator.streamCommands(GrblCommunicator.java:167)
    at GrblCommunicator.responseMessage(GrblCommunicator.java:240)
    at ResponseMessageHandler.handleResponse(ResponseMessageHandler.java:33)
    at SerialConnectionJserial.serialEvent(SerialConnectionJserial.java:114)
    at com.fazecast.jSerialComm.SerialPort$SerialPortEventListener.waitForSerialEvent(SerialPort.java:1391)
    at com.fazecast.jSerialComm.SerialPort$SerialPortEventListener$1.run(SerialPort.java:1295)

您无法查看 LinkedList 中的项目并且使其大小为零。 想想你在说什么 - “我怎么能看这个值,让列表没有值?”。 这样做的原因是peek()检索列表中的第一项但不删除它。 但是,您可能正在寻找pop() 使用pop()您可以同时检索和删除第一项。 根据此处的文档“从此列表表示的堆栈中弹出一个元素。换句话说,删除并返回此列表的第一个元素”。

LinkedList<String> myList = new LinkedList<>();
myList.add("blablabla");
System.out.println("String: " + myList.pop() + ", Size: " + myList.size());

这打印出来:

String: blablabla, Size: 0

目前,唯一的解释是在这个线程中

“一个 LinkedList 不是线程安全的”

线程安全问题

所以我将使用:LinkedBlockingQueue

如果您绝对需要在大小为 0 时返回一个值,您有几个选择。

  1. 创建您自己的LinkedList实现
  2. 捕获当前将抛出的异常,然后返回您认为适合此场景的值
  3. 在调用.peek()之前检查链表的大小,如果大小为 0,则返回适当的值而不是调用.peek()如果不是 0,则继续调用。

java.util.LinkedList 的 peak() 方法的实现表示“检索但不删除此列表的头部(第一个元素)。”

所以使用 java.util.LinkedList 是不可能的。

您可能已经从“java.util.LinkedList”以外的其他库中导入了 LinkedList

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM