相关疑难解决方法(0)

HashMap中的并发修改异常

我正在用Java编写这个程序,我得到了一个java.util.ConcurrentModificationException.代码摘录如下,如果需要更多代码,请告诉我.

for (String eachChar : charsDict.keySet()) {
    if (charsDict.get(eachChar) < 2) {
        charsDict.remove(eachChar);
    }
}
Run Code Online (Sandbox Code Playgroud)

charsDict 被定义为

Map<String, Integer> charsDict = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

请帮我 :)

java list hashmap

2
推荐指数
2
解决办法
221
查看次数

Java:for循环和迭代器

每个使用Iterator的For循环(使用Iterator.remove();方法)如下所示:

for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
    E element = iter.next();
    //some code
}
Run Code Online (Sandbox Code Playgroud)

基本的循环样式:

for([initial statement]; [loop condition]; [iterating statement]) {/*Some Code*/}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是......为什么他们从未写过

for (Iterator<E> iter = list.iterator(); iter.hasNext(); E element = iter.next()) {
    //some code
}
Run Code Online (Sandbox Code Playgroud)

java iterator for-loop

2
推荐指数
2
解决办法
265
查看次数

'instanceof'不一致

嘿编程学生在这里.

我有一个JavaFX应用程序.我有一个窗格,我想从中删除所有矩形.这是代码:

public Pane yard = new Pane();
...
for(int i = 0; i < yard.getChildren().size(); i++)
{
    if(yard.getChildren().get(i) instanceof Rectangle)
    {
        yard.getChildren().remove(i);
    }
 }
Run Code Online (Sandbox Code Playgroud)

这有时很好.其他时候它根本无法删除任何东西.谢谢您的帮助.

java javafx

2
推荐指数
1
解决办法
130
查看次数

为什么在ArrayList上使用for-each循环不起作用?

偶然发现了这个代码,它抛出了一个ConcurrentModificationException

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

for (String s : list) {
    if (s.equals("a"))
        list.remove(s);
}
Run Code Online (Sandbox Code Playgroud)

如果你添加一个迭代器并使用while循环,代码工作正常:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();

    if (s.equals("a")) {
        iter.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么有必要Iterator<String>在这种情况下使用.是因为ArrayList没有某种迭代能力,尽管它是Collection子类

是否有必要使用while循环,或者您是否可以生成带有for循环的版本?

java exception arraylist

2
推荐指数
2
解决办法
1万
查看次数

尝试运行`.size()`方法时ArrayList抛出`ConcurrentModificationException`

更新资料

正如Jiri Tousek所指出的那样,我的代码中抛出的错误误导了许多业余(和经验丰富)的Java开发人员。相反的是名字似乎暗示,ConcurrentModificationException不能有任何与多线程。考虑以下代码:

import java.util.List;
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    List<String> originalArray = new ArrayList<>();
    originalArray.add("foo");
    originalArray.add("bar");
    List<String> arraySlice = originalArray.subList(0, 1);
    originalArray.remove(0);
    System.out.println(Integer.toString(arraySlice.size()));
  }
}
Run Code Online (Sandbox Code Playgroud)

ConcurrentModificationException尽管不涉及线程,但这将抛出一个错误。

误导性的异常名称使我认为我的问题是我处理多线程的结果。我已用实际问题更新了帖子标题。

原文(标题:如何通知Java您已完成对线程中ArrayList的修改?)

我的代码大致如下所示:

class MessageQueue {
    private List<String> messages = new ArrayList<>();
    private List<String> messagesInFlight = new ArrayList<>();

    public void add(String message) {
        messages.add(message);
    }

    public void send() {
        if (messagesInFlight.size() > 0) {
            // Wait for previous request to …
Run Code Online (Sandbox Code Playgroud)

java

2
推荐指数
1
解决办法
83
查看次数

为什么“foreach”循环会产生异常?

我使用 Stack 和 StringBuilder 类编写了用于字符串反转的代码。我注意到这段代码中的 'foreach' 循环会生成 java.util.ConcurrentModificationException,但通常的 'for' 循环不会。所以为什么?

public static String reverse(String str)
{
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.length(); i++)
        stack.push(str.toCharArray()[i]);
    }


    for (Character c: stack) // generates an exception
    {
        sb.append(stack.pop());
    }

    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

我期望一个反转的字符串,但发生了 ConcurrentModificationException。

java

2
推荐指数
1
解决办法
151
查看次数

为什么java语言禁止程序在程序迭代时更新集合呢?

我知道在java.util.AbstractList中有一个名为"Itr"的InnerClass.并且有一个名为"expectedModCount"的字段,一个名为"checkForComodification"的方法.当迭代一个集合但更新集合时,这个方法会抛出ConcurrentModificationException我想知道为什么java语言设计得像这样?这样做的目的是什么?

谢谢 !

java

1
推荐指数
1
解决办法
113
查看次数

为什么ArrayList中的ConcurrentModificationException?

为什么下面的代码抛出ConcurrentModificationException?Josh Bloch可以避免ConcurrentModificationException.

ArrayList<Integer> list=new ArrayList<Integer>();
list.add(100);
list.add(200);
list.add(300);
list.add(400);
for(Integer field : list) {    
    list.remove(field);
    list.add(200);
}       
Run Code Online (Sandbox Code Playgroud)

java collections

1
推荐指数
1
解决办法
618
查看次数

循环List <String>并删除项目的更好方法

我有一个List,如果匹配,我将循环删除列表中的项目.如果列表中的项目被删除,我正在使用i = -1.但它又从头开始循环.有一个更好的方法吗?

private List<String> populateList(List<String> listVar) {
    List<String> list = new ArrayList<String>();
    list.add("2015-01-13 09:30:00");
    list.add("2015-01-13 06:22:12");
    list.add("2015-01-12 05:45:10");
    list.add("2015-01-12 01:52:40");
    list.add("2015-01-12 02:23:45");
    return list;
}

private void removeItems() {
    List<String> list = new ArrayList<String>();
    list = populateList(list);  
    System.out.println("List before modification : "+list);
    for (int i = 0; i <  list.size(); i++) {
        String dateNoTime = list.get(i).split(" ")[0];
        System.out.println("   Going over : "+list.get(i));
        if(!dateNoTime.equalsIgnoreCase("2015-01-13")) {
            System.out.println("      Removing : "+list.get(i));
            list.remove(i);
            i = -1; //This is making the loop start from …
Run Code Online (Sandbox Code Playgroud)

java

1
推荐指数
1
解决办法
122
查看次数

java.util.HashMap ----查看控制台,为什么打印顺序是这样的

今天我研究从java.util.HashMap中删除特殊对象.我测试了错误的语法.但我遇到了一个很棒的问题.控制台上的消息不在订单中.异常消息由错误的订单打印.程序似乎是用多线程执行的.以下是我的代码.

package com.study.iter;

import java.util.HashMap;
import java.util.Map;

public class TestRmObjFromMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap();

        map.put("1", 1);
        map.put("2", 2);
        map.put("3", 3);
        map.put("4", 4);

        remove1(map);
    }

    private static void remove1(Map<String, Integer> map) {

        for(Map.Entry<String, Integer> entry : map.entrySet()) {

            if(entry.getKey().equals("3")) {
                map.remove(entry.getKey());
            }
            else {
                System.out.println("key: " + entry.getKey() + " -- value: " + entry.getValue());
            }

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

运行此代码后,它将打印以下内容:

Exception in thread "main" java.util.ConcurrentModificationException
key: 1 -- value: 1
key: 2 …
Run Code Online (Sandbox Code Playgroud)

java hashmap

1
推荐指数
1
解决办法
80
查看次数

标签 统计

java ×10

hashmap ×2

arraylist ×1

collections ×1

exception ×1

for-loop ×1

iterator ×1

javafx ×1

list ×1