簡體   English   中英

Java:`iterator.remove` 拋出 IllegalStateException

[英]Java: `iterator.remove` throws IllegalStateException

我在一個thread有一個iterator ,我正在嘗試刪除重復的記錄。

 Runnable readingThread = new Runnable() {
        @Override
        public void run() {

            Iterator<Demand> iterator = null;
            for (iterator = demandListFromFile.iterator(); iterator.hasNext();) {
                Demand demand = iterator.next();

                /**
                 * Find and assign the Item ID
                 */
                if (itemListHashMap.containsValue(demand.getItem().getItemName())) {
                    demand.getItem().setIditem(itemListHashMapReversed.get(demand.getItem().getItemName()));

                } else {
                    unavailableItemsList.add(demand.getItem().getItemName());
                }


                /**
                 * Find and remove duplicate records
                 */
                for (Map.Entry<Date, String> entry : demandListHashMap.entries()) {

                    if (demand.getDueDate().equals(entry.getKey()) && demand.getItem().getItemName().equals(entry.getValue())) {

                        iterator.remove();
                    }

                }

            }

        }

刪除幾個項目后, iterator.remove拋出以下異常

Exception in thread "Thread-0" java.lang.IllegalStateException
    at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:1009)
    at com.xxx.xxx.ui.Home$7.run(Home.java:455)
    at java.base/java.lang.Thread.run(Thread.java:834)

為什么會這樣? 請注意,我已經刪除了迭代器前后的代碼,以保持這篇文章的簡短。

Iterator.java 移除方法:

    @throws IllegalStateException if the next method has not
              yet been called, or the remove method has already
              been called after the last call to the next method
    void remove() {
        ..
    }

問題出在您的 for 循環“查找並刪除重復記錄”中,您可能不止一次調用 iterator.remove。 remove 方法刪除您正在查看的當前元素,因此您每次只能使用 next() 調用它一次。 為了確保它只被調用一次,在iterator.remove();下面添加一個break語句iterator.remove();

@CausingUnderflowsEverywhere陳述的原因是完全正確的。

除此之外,在看到實現后, iterator.remove元素在內部調用ArrayList.remove方法。

ArrayList 維護在名為lastRet的變量中返回的最后一個元素的索引。刪除元素后,ArrayList.remove 方法將lastRet設置為 -1。

ArrayList.remove 的第一個檢查是

if (lastRet < 0)
{
     throw new IllegalStateException();
}

這就是后台發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM