2014-11-03 29 views
0

我想要做的是允許用戶輸入名字和姓氏。允許用戶輸入第一個名字,但沒有問題,但一旦命中空格並輸入姓氏,它會給我標題中提到的錯誤。Java - java.util.InputMismatchException

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

嘗試,而不是下一個nextLine()() – Michael 2014-11-03 17:46:18

+0

我說,我已經試過了。但是,我會再試一次。你想去哪裏去取代它?在兩個變量?或者只是名稱變量? – 2014-11-03 17:47:25

+0

我只是在我的機器上測試了你的程序,我沒有收到任何錯誤(除了在'choice'的定義之後有''',而不是';'。你確定你給我們展示了相同的你有什麼版本? – RealSkeptic 2014-11-03 18:02:28

回答

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(); 
      } 
+0

足夠簡單的答案,它完美的工作。謝謝你。 – 2014-11-03 17:59:47

+0

歡迎:)...... – kirti 2014-11-03 18:00:39

0

這是因爲sc.next()不會消耗的空間。所以它會讀取下一個標記(在這種情況下是空格後面的姓)而不是下一個輸入的東西。自己嘗試:當你輸入名字時輸入Firstname 1,它會自動輸入學號碼1。使用掃描儀的nextLine()方法消耗整條生產線。

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

+0

好的,我用name = sc.nextLine()取代了name = sc.next();所做的只是將學生名字和學生號碼放在同一行當我跑它 – 2014-11-03 17:55:13

+0

@SlowpPowl我建議使用'nextLine()'作爲這種類型的分步程序的任何輸入。你可以分析這個行,但是你希望適合任何數據類型。 – kingdamian42 2014-11-03 17:59:50

1

解析您的INT選擇使用next()將只返回前space.That意味着它不會佔用的空間會發生什麼。但nextLine()在返回當前行後自動移動掃描儀。 所以,只需將next()替換爲代碼中的nextline()即可。

相關問題