老师,我有个问题。 我自己本节课的写代码的时候有两个方法都调用了Scanner console = new Scanner(System.in); 然后都写在了console.close()这句话,编译报错说“ java.util.NoSuchElementException”。 当我把第一个方法的console.close();这句话删除后就正常了,请问在一个类的两个不同的方法中分别
package studentTest1; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; public class MapTest { public Map<String , Student> students; //构造函数 public MapTest(){ students = new HashMap<String,Student>(); } //学生ID姓名添加函数 public void input(){ int i = 0; Scanner scan = new Scanner(System.in); while(i < 3){ System.out.println("请输入学生ID"); String ID = scan.next(); Student st = students.get(ID); if( st == null){ System.out.println("请输入学生姓名"); String name = scan.next(); Student S = new Student(ID,name); students.put(ID,S); System.out.println("学生:" + students.get(ID).name + "已添加成功"); i++; }else{ System.out.println("改学生姓名已被占用"); continue; } } scan.close(); //(就是这里的问题,如果把这句话删除,那删除函数就可以正常进行,但是加上这句话有错么,为什么会对删除函数中的Scanner输入函数有影响呢?) } // 键的测试函数 public void testKey(){ Set<String> keySet = students.keySet(); //学生容量 System.out.println("总共有" + students.size() + "个学生"); for( String stuId : keySet){ Student st = students.get(stuId); if(st != null){ System.out.println("学生" + st.name); } } } // 删除测试函数 public void testRemove(){ Scanner scan = new Scanner(System.in); while(true){ System.out.println("请输入需要删除的学生ID"); String ID = scan.next(); Student newst = students.get(ID); if(newst == null){ System.out.println("请输入需要删除的学生ID"); continue; } students.remove(ID); System.out.println("成功删除的学生" + newst.name); // break; } } //使用entrySet来遍历Map public void testEntrySet(){ Set<Entry<String,Student>> setMap = students.entrySet(); for(Entry<String,Student> entry : setMap){ System.out.println("学生" + entry.getKey() + entry.getValue().name); } } }
实例化两个输入类,他第一个Scanner类的console.close(),会对第二个Scanner类的 Scanner.next()有影响,这是为什么呢?
//学生ID姓名添加函数 public void input(){ int i = 0; Scanner scan = new Scanner(System.in);//这行应该放入循环里面 while(i < 3){ System.out.println("请输入学生ID"); //放在这里,每次输入键盘值前初始化一下,重新输入,不然一直是一开始输入的值。 String ID = scan.next(); Student st = students.get(ID);
第二季作业碰到过这种情况,我是这样解决的,还有很多其他办法解决
我与你有相同疑问
你要的答案在这里:
http://bbs.csdn.net/topics/390788856
因为两个Scanner使用的是同一个输入流