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

第一个输入方法的Scanner.close()会对下一个输入方法的Scanner.next()有影响,为什么?

老师,我有个问题。 我自己本节课的写代码的时候有两个方法都调用了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()有影响,这是为什么呢?

提问者:咩小蛮 2016-05-08 21:30

个回答

  • 慕粉18817939419
    2016-07-28 18:27:30

     //学生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);

    第二季作业碰到过这种情况,我是这样解决的,还有很多其他办法解决

  • wshyzx
    2016-07-25 01:01:43

    我与你有相同疑问

    你要的答案在这里:

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

  • deidei
    2016-05-09 17:00:56

    因为两个Scanner使用的是同一个输入流