我正在用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)
请帮我 :)
每个使用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) 嘿编程学生在这里.
我有一个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)
这有时很好.其他时候它根本无法删除任何东西.谢谢您的帮助.
我偶然发现了这个代码,它抛出了一个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循环的版本?
正如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尽管不涉及线程,但这将抛出一个错误。
误导性的异常名称使我认为我的问题是我处理多线程的结果。我已用实际问题更新了帖子标题。
我的代码大致如下所示:
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) 我使用 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.util.AbstractList中有一个名为"Itr"的InnerClass.并且有一个名为"expectedModCount"的字段,一个名为"checkForComodification"的方法.当迭代一个集合但更新集合时,这个方法会抛出ConcurrentModificationException我想知道为什么java语言设计得像这样?这样做的目的是什么?
谢谢 !
为什么下面的代码抛出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) 我有一个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.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)