Java Scanner错误读取空间

时间:2015-03-16 02:33:41

标签: java java.util.scanner

我无法使用扫描仪更新对象的变量名称。我向用户提供菜单,用户选择他的选择(更新名称),程序要求用户输入新名称,Scanner读取系统。并更新变量的名称。唯一的麻烦是程序无法读取带空格的字符串。例如

while(i ==1 ) {
     System.out.printf("\n%s Properties Menu\n---------------\n1.Update Name\n2.Update Registration\n3.Update Transponder\n4.Update Capacity\n5.Update Length\n6.Update Beam\n7.Update Draft\n8.Update Longitude and Latitude\n9.Update Cargo\n10.Display the Ship\n11.Previous Menu\n",shipArrayList.get(decision).getShipName());
     shipProperties = myScanner.nextInt();  // error line 121 here
     if(shipProperties == 1) {
          System.out.print("\nEnter a new name :");
          newString = myScanner.next();     // or nextLine():    
          shipArrayList.get(decision).setShipName(newString);
     }

如果我键入tDog之类的内容,但是如果我输入T dog,我将获得java.util.InputMismatchException,输出示例如下

Enter a new name :t dog

t Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
11.Previous Menu
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at main.Map.updateShip(Map.java:121)
    at main.main.main(main.java:48)
Java Result: 1

因此,我猜测它只读取t,当扫描仪扫描shipProperty值时,它会读取狗而不是等待输入。我读过有关nextLine()的内容,但会跳过整个用户输入部分,例如,使用newString = myScanner.next()输出切换newString = myScanner.nextLine() ....

DarkGoat Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
11.Previous Menu
1                           //i enter 1 to update name

Enter a new name :          //skips name input and waits for property input
 Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
11.Previous Menu

所以我的问题是如何让Scanner接受带空格作为有效字符串的输入。

2 个答案:

答案 0 :(得分:1)

next读一个字。如果要读取整行(直到用户按下ENTER键),请使用nextLine

你得到了例外,因为next调用会读取并返回" T"以及" dog"留给下一个电话 - 恰好是nextInt,因为" dog"不是一个int。

答案 1 :(得分:0)

myScanner.nextInt();之后,您应该在阅读下一个数据之前添加myScanner.nextLine();