【问题标题】:Remove Entries From TreeMap, getting java.util.NoSuchElementException从 TreeMap 中删除条目,得到 java.util.NoSuchElementException
【发布时间】:2014-08-01 07:20:16
【问题描述】:

我正在尝试使用一些逻辑从 TreeMap 中删除一些条目。这是我的代码

TreeMap<String, Object> treeMap = someEntries();
Iterator<Entry<String, Object> iter = treeMap.entrySet().iterator();
Map.Entry<String, Object> entry = null;

while ((entry = iter.next()) != null) {
    if (!entry.getKey().contains(search)) {
        iter.remove();
    }
}

得到异常:-

java.util.NoSuchElementException
    at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1113)
    at java.util.TreeMap$EntryIterator.next(TreeMap.java:1151)
    at java.util.TreeMap$EntryIterator.next(TreeMap.java:1146)

什么是异常?这是迭代过程中的错误。也请给我一个正确的方法。

【问题讨论】:

  • (entry = iter.next()) != null...当迭代器没有更多元素时,iter.next()不会是null,而是抛出异常。

标签: java iterator treemap


【解决方案1】:

您应该像这样检查下一个元素:

    TreeMap<String, Object> treeMap = someEntries();
    Iterator<Entry<String, Object>> iter = treeMap.entrySet().iterator();
    Entry<String, Object> entry;
    while (iter.hasNext()) {
        entry = iter.next();
        if (!entry.getKey().contains(search)) {
            iter.remove();
        }
    }

如果在没有下一个元素时调用 iter.next()NoSuchElementException 会被抛出。

【讨论】:

    【解决方案2】:

    您应该像这样检查Iterator#hasNext() 而不是Iterator#next()

    while (iter.hasNext()) {
        entry = iter.next();
        if (!entry.getKey().contains(search)) {
            iter.remove();
        }
    }
    

    【讨论】:

      【解决方案3】:

      当你遍历到最后一个元素时,'next'点为NULL,所以你走到最后会得到NoSuchElementException。 使用以下代码试一试:

      TreeMap<String, Object> treeMap = new TreeMap<String, Object>();
      treeMap.put("a", 1);
      treeMap.put("b", 2);
      treeMap.put("c", 3);
      treeMap.put("d", 4);
      Iterator<Entry<String, Object>> iter = treeMap.entrySet().iterator();
      Map.Entry<String, Object> entry = null;
      
      while (iter.hasNext()) {
          entry = iter.next();
          System.out.println(entry.getKey());
          if (!entry.getKey().contains("a")) {
                 iter.remove();
          }
      }
      
      System.out.println("-----");
      iter = treeMap.entrySet().iterator();
      while (iter.hasNext()) {
          entry = iter.next();
          System.out.println(entry.getKey());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-19
        • 2016-11-06
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 2013-06-27
        • 1970-01-01
        相关资源
        最近更新 更多