我要做的是允许用户输入名字和姓氏。允许用户输入没有问题的名字,但是一旦命中空格并输入他们的姓氏,它就会给出标题中提到的错误。
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)
答案 0 :(得分:1)
使用next()只会返回空格之前的内容。这意味着它不会消耗空间。但是,在返回当前行后,nextLine()会自动向下移动扫描器。 所以,只需在代码中用nextline()替换next()即可。
答案 1 :(得分:0)
这是因为sc.next()
不会占用空间。因此它将读取下一个标记(在这种情况下是空格后的姓氏)而不是输入的下一个标记。试试自己:当你输入一个名字时输入Firstname 1
,它会自动输入1号学生。使用扫描仪的nextLine()
方法来消耗整行。
您可以使用Integer.parseInt(sc.nextLine());
答案 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();
}