簡體   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