勉强的是,这段小代码抛出了上面提到的Exception.另外,查看网络上发布的代码似乎是正确的:
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorTest {
ArrayList<Integer> arr = new ArrayList<Integer>();
Iterator i = arr.iterator();
public void show() {
arr.add(2);
arr.add(5);
arr.add(9);
while(i.hasNext()){
System.out.println(i.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?谢谢
我有一个帐户列表,当我进行长按时,我想从arraylist中删除该项目.我正在尝试从alertdialog中删除它,但我得到了ConcurrentModificationException.这是崩溃的地方:
listAccounts.forEachIndexed { index, account ->
if (idParamether == account.id) {
listAccounts.remove(account)
}
}
Run Code Online (Sandbox Code Playgroud) 我遇到了ConcurrentModificationException,通过查看它我看不出它为什么会发生的原因; 抛出异常的区域和修改集合的所有位置都被包围
synchronized (this.locks.get(id)) {
...
} // locks is a HashMap<String, Object>;
Run Code Online (Sandbox Code Playgroud)
我试图抓住讨厌的线程,但我可以钉(通过在异常中设置一个断点)是抛出线程拥有监视器而另一个线程(程序中有两个线程)休眠.
我该怎么办?当遇到类似的线程问题时,您通常会做什么?
我看到一种奇怪的行为.
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
li.add("e");
for(String str:li){
if(str.equalsIgnoreCase("d")){
li.remove(str); //removing second last in list works fine
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试删除列表中的第二个以外的任何其他,我得到ConcurrentModificationException.在阅读"Oracle认证助理Java SE 7程序员学习指南2012"时,我注意到它错误地假设.remove()始终使用删除列表中倒数第二个的示例.
我不明白为什么在迭代这个时我得到一个ConcurrentModificationException multimap.我读了以下条目,但我不确定我是否理解了整个事情.我试图添加一个synchronized块.但我怀疑的是与什么同步,何时.
这multimap是一个字段,创建如下:
private Multimap<GenericEvent, Command> eventMultiMap =
Multimaps.synchronizedMultimap(HashMultimap.<GenericEvent, Command> create());
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
eventMultiMap.put(event, command);
Run Code Online (Sandbox Code Playgroud)
并且像这样(我试图在地图上同步这部分,但没有成功)
for (Entry<GenericEvent, Command> entry : eventMultiMap.entries()) {
if (entry.getValue().equals(command)) {
eventMultiMap.remove(entry.getKey(), entry.getValue());
nbRemoved++;
}
}
Run Code Online (Sandbox Code Playgroud) 根据运行时错误消息,异常发生在以下行中;
VirusData v = iteratorVirusDB.next();
Run Code Online (Sandbox Code Playgroud)
VirusData 是一个带有构造函数和重载构造函数的类,其中包含有关数据库中每种病毒的特定信息,例如;
重载
iteratorVirusDBtype <VirusData>是.iterator()VirusDB,如下所示:
Iterator<VirusData> iteratorVirusDB = virusDB.iterator();
Run Code Online (Sandbox Code Playgroud)
VirusDBis和ArrayList的类型<VirusData>,我存储病毒对象(此时名称和def),以便我以后可以使用它们.
ArrayList <VirusData> virusDB = new ArrayList<VirusData>();
Run Code Online (Sandbox Code Playgroud)
最后,在使用上述所有解释的方法中发生错误:
private void selectDabataseMouseClicked(java.awt.event.MouseEvent evt) {
while(iteratorVirusDB.hasNext()) {
VirusData v = iteratorVirusDB.next(); //ERROR LINE
String vSig = v.signature;
v.tokens = tokenize.raw(vSig, true, tLength);
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我可以真正做一些帮助和建议,如何解决这个问题,以使程序成功运行.Bellow,完整的StackTrace:
run:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at project_clean.Main.selectDabataseMouseClicked(Main.java:275)
at project_clean.Main.access$100(Main.java:11)
at project_clean.Main$2.mouseClicked(Main.java:76)
at …Run Code Online (Sandbox Code Playgroud) 当我执行以下代码时,我得到ConcurrentModificationException
Collection<String> myCollection = Collections.synchronizedList(new ArrayList<String>(10));
myCollection.add("123");
myCollection.add("456");
myCollection.add("789");
for (Iterator it = myCollection.iterator(); it.hasNext();) {
String myObject = (String)it.next();
System.out.println(myObject);
myCollection.remove(myObject);
//it.remove();
}
Run Code Online (Sandbox Code Playgroud)
为什么我得到异常,即使我使用Collections.synchronizedList?
当我将myCollection更改为
ConcurrentLinkedQueue<String> myCollection = new ConcurrentLinkedQueue<String>();
Run Code Online (Sandbox Code Playgroud)
我没有得到那个例外.
java.util.concurrent中的ConcurrentLinkedQueue与Collections.synchronizedList有何不同?
我正在遭遇这个例外.我的代码有什么问题?我只想将Person的重复名称分开ArrayList
public class GlennTestMain
{
static ArrayList<Person> ps;
static ArrayList<Person> duplicates;
public static void main(String[] args)
{
ps = new ArrayList<GlennTestMain.Person>();
duplicates = new ArrayList<GlennTestMain.Person>();
noDuplicate(new Person("Glenn", 123));
noDuplicate(new Person("Glenn", 423));
noDuplicate(new Person("Joe", 1423)); // error here
System.out.println(ps.size());
System.out.println(duplicates.size());
}
public static void noDuplicate(Person p1)
{
if(ps.size() != 0)
{
for(Person p : ps)
{
if(p.name.equals(p1.name))
{
duplicates.add(p1);
}
else
{
ps.add(p1);
}
}
}
else
{
ps.add(p1);
}
}
static class Person
{
public Person(String n, int num) …Run Code Online (Sandbox Code Playgroud) 我有一个ArrayList包含一些对象,例如User,每个对象都有一个name和password属性.如何仅删除User具有特定"名称" 的对象ArrayList?
我试图了解 SynchronizedMap 并运行以下代码。我得到以下输出,但有一个例外。根据我的理解,当线程仍在对映射执行写入或线程处于睡眠状态时,get() 方法尝试访问同步映射时会导致异常。我的理解是正确的还是我遗漏了什么?
class MapHelper1 implements Runnable {
Map<String, Integer> map;
public MapHelper1(Map<String, Integer> map) {
this.map = map;
new Thread(this, "MapHelper1").start();
}
public void run() {
map.put("One", 1);
try {
System.out.println("MapHelper1 sleeping");
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
}
}
class MapHelper2 implements Runnable {
Map<String, Integer> map;
public MapHelper2(Map<String, Integer> map) {
this.map = map;
new Thread(this, "MapHelper3").start();
}
public void run() {
map.put("two", 1);
try {
System.out.println("MapHelper2 sleeping");
Thread.sleep(100);
} catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) java ×9
concurrency ×3
arraylist ×2
exception ×2
iterator ×2
collections ×1
foreach ×1
guava ×1
kotlin ×1
multimap ×1
while-loop ×1