Java - java.util.InputMismatchException

时间:2014-11-03 17:42:45

标签: java

我要做的是允许用户输入名字和姓氏。允许用户输入没有问题的名字,但是一旦命中空格并输入他们的姓氏,它就会给出标题中提到的错误。

    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int choice, 
        String name, stuNum;

        do
        {   
            System.out.println("");
            System.out.println("Student Grade System");
            System.out.println("----------------------\n");
            System.out.println("   1) Enter student details");
            System.out.println("   2) Display student grades");
            System.out.println("   3) Display student statistics");
            System.out.println("   4) Display full transcript");
            System.out.println("   0) Exit System\n");
            System.out.print("Select an option [0-4] >> ");
            choice = sc.nextInt();
            System.out.println("");

            switch(choice)
            {
                case 1:
                System.out.println("Entering Student Details");
                System.out.println("------------------------");
                System.out.print("   Student name:                               ");
                name = sc.next(); //somewhere here it messes up
                System.out.print("   Student number:                             ");
                stuNum = sc.next();
            }
         }while(choice !=0);
}

这是我的代码的最低限度,因为我刚刚开始编写它,但这个问题阻止了我进一步发展。我已经尝试过使用sc.nextLine();并将变量stuNum更改为int变量。两者都不起作用。它给出的完整错误如下:

java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:840) at java.util.Scanner.next(Scanner.java:1461) at java.util.Scanner.nextInt(Scanner.java:2091) at java.util.Scanner.nextInt(Scanner.java:2050) at Project.main(Project.java:40)

3 个答案:

答案 0 :(得分:1)

使用next()只会返回空格之前的内容。这意味着它不会消耗空间。但是,在返回当前行后,nextLine()会自动向下移动扫描器。 所以,只需在代码中用nextline()替换next()即可。

答案 1 :(得分:0)

这是因为sc.next()不会占用空间。因此它将读取下一个标记(在这种情况下是空格后的姓氏)而不是输入的下一个标记。试试自己:当你输入一个名字时输入Firstname 1,它会自动输入1号学生。使用扫描仪的nextLine()方法来消耗整行。

您可以使用Integer.parseInt(sc.nextLine());

解析您的int选项

答案 2 :(得分:0)

在取得学生姓名

后,使用额外的nextLine来刷新扫描仪缓冲区
switch(choice)
            {
                case 1:
                System.out.println("Entering Student Details");
                System.out.println("------------------------");
                System.out.print("   Student name:                               ");
                name = sc.nextLine(); //somewhere here it messes up
sc.nextLine();  // to clean the enter key stored in the buffer
                System.out.print("   Student number:                             ");

                stuNum = sc.nextLine();
            }