问答详情
源自:5-3 学生选课---删除 Map 中的学生

来吧,有问题了,大家共同进步

package start;


import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

import java.util.Set;


public class TestSet {


Map<String,Student> mt = new HashMap<String,Student>();

Scanner Input = new Scanner(System.in);

public void addElement(){

int i = 0;

while(i < 3){

System.out.println("请输入学生ID:");

String id = Input.next();

if(mt.get(id) == null){

System.out.println("请输入学生姓名:");

String name = Input.next();

Student newstudent = new Student(id,name);

System.out.println("学生信息成功存入档案!");

mt.put(id, newstudent);

i++;

}else{

System.out.println("学生ID已经被占用!!");

continue;

}

 }

}

public void getElement(){

Set<String> set = new HashSet();

set = mt.keySet();

for (String string : set) {

Student test = mt.get(string);

if(test != null)

System.out.println("学生姓名为:"+test.Name);

}

}

public void Remove(){

System.out.println("请输入你要删除的学生ID:");

String Id = Input.next();

Set<String> set = new HashSet();

set = mt.keySet();

for ( String key : set) {

if(Id.equals(key))

mt.remove(key);

}

}

public void EntrySet(){

Set<Entry<String,Student>> entryset = mt.entrySet();

for (Entry<String, Student> entry : entryset) {

System.out.println(entry.getValue().Name);

}

}

public static void main(String[] args) {

TestSet te = new TestSet();

te.addElement();

te.getElement();

te.Remove();

te.EntrySet();

}

}



这是问题


请输入学生ID:

1

请输入学生姓名:

1

学生信息成功存入档案!

请输入学生ID:

2

请输入学生姓名:

2

学生信息成功存入档案!

请输入学生ID:

3

请输入学生姓名:

3

学生信息成功存入档案!

学生姓名为:3

学生姓名为:2

学生姓名为:1

请输入你要删除的学生ID:

3

Exception in thread "main" java.util.ConcurrentModificationException

at java.util.HashMap$HashIterator.nextEntry(Unknown Source)

at java.util.HashMap$KeyIterator.next(Unknown Source)

at start.TestSet.Remove(TestSet.java:46)

at start.TestSet.main(TestSet.java:64)

????我想知道为什么会出现这种错误呢???

提问者:怒放的生命012 2016-06-09 21:28

个回答

  • helloworld2008
    2016-06-21 18:04:46
    已采纳

    专门去网上搜了下,答案挺高深的,对于我这个菜鸟都算不上的,真心看不懂。只是给你个地址,去看看吧。

    http://bbs.csdn.net/topics/370149418

    【如果我对集合添加删除一共操作了10次,此时modCount为10,  获取迭代器的时候expectedModCount也为10,  迭代期间会去 checkForComodification()!  只要在next或者remove之前有对集合操作的动作导致modCount发生了改变, 就会 抛那个并发修改异常!】

  • 蒲杰
    2016-08-20 10:16:07

    问题出在Remove方法中的if判断语句,用==不能用equals方法

  • 怒放的生命012
    2016-06-09 21:41:36

    public void Remove()这个方法显示是错误的根源