Scanner在nextInt上抛出NoSuchElementException

时间:2014-08-07 06:03:48

标签: java

逻辑工作正常,但是当while循环到达终点并重新开始时,当它再次使用此行从键盘读取我的下一个选项时 - > option = kb.nextInt(); 。它给了我一个例外,更确切地说是下面这个:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at view.ClientFacade.main(ClientFacade.java:18)

下面是我的代码,为什么这个Scanner会产生这个错误?还有其他方法可以从键盘上读取吗?

public class ClientFacade {
    public static Scanner kb = new Scanner(System.in);

    public static void main(String[] args) {
        boolean exit = false;
        int option = 0;
        RegistrationController rc = new RegistrationController();

        while(exit == false){
            System.out.println("Menu:");
            System.out.println("1 - Sign up on service.");

            option = kb.nextInt(); //ERROR ON THIS LINE WHEN IT EXECUTES ON THE SECOND LOOP

            switch(option){

            case 0:{
                exit = true;
                break;
            }
            case 1:{
                rc.userSignUp();
                break;
            }
            default:{
                System.out.println("Invalid option.");
                break;
            }

            }
        }
    }
}

下面这个方法是在另一个类文件RegistrationController.java上,所以它由上面的rc viariable实例化。

public void userSignUp(){
        User usr = new User();
        RegistrationController rc = new RegistrationController();
        String regex = "$(\\w)+(\\,)(\\w)+(\\,)(\\d){2,3}(\\,)[F,M](\\,)(\\w)+(@)(\\w)+(.)(\\w)+((.)(\\w)+)(,)(\\w)+^";
        Scanner sc = new Scanner(System.in);
        System.out.println("Input a single line separated by COMMA,"
                + " the software will validade your entry.\n"
                + "1 - Your First Name, 2 - Your Second Name,"
                + " 3 - Your Age, 4 - Your Gender \n(F or M in UPPER CASE)"
                + " 5 - Your Email, 6 - Your Password:\n");
        String s = sc.nextLine();
        s = s.trim();
        System.out.println("trimmed"); //DEBUG
        String [] k = s.split(",");
        char[] c = k[3].toCharArray();

        if (Pattern.matches(regex, s)){
            usr.setAdmLevel(0);
            usr.setName(k[0]+" "+k[1]);
            usr.setAge(Integer.parseInt(k[2]));
            usr.setGender(c[0]);
            usr.setEmail(k[4]);
            usr.setPassword(k[5]);
            if (rc.registerUser(usr) != 0){
                System.out.println("Your are signed up! Your ID: "+usr.getId());
            }else {
                System.out.println("A problem ocurred, not registered.");
            }
        }else{
            System.out.println("Wrong input pattern, try again.");
        }
        sc.close();
    }

2 个答案:

答案 0 :(得分:8)

当您致电sc.close()时,它会关闭您的基础流,即System.in;关闭System.in后,恢复计划的唯一方法就是重新启动程序。

根据close() Javadoc,

  

如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,那么将调用可读的close方法

答案 1 :(得分:7)

您关闭了关闭基础流的Scanner。不要用标准的细节来做到这一点。