Пробелы для чтения ошибок Java Scanner

У меня проблемы с обновлением имени переменной для объекта с помощью сканера. Я предлагаю меню пользователю, пользователь выбирает свой выбор (обновление имени), программа просит пользователя ввести новое имя, Сканер читает system.In и обновляет имя переменной. Единственная проблема в том, что программа не может прочитать строку с пробелами. Например

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

поэтому мой вопрос заключается в том, как заставить сканер принимать ввод с пробелами как допустимую строку.


person Zach Santiago    schedule 16.03.2015    source источник


Ответы (2)


next читает одно слово. Если вы хотите прочитать всю строку (пока пользователь не нажмет ENTER), используйте nextLine.

Вы получаете исключение, потому что вызов next читает и возвращает "T", а "собака" остается для следующего вызова - который оказывается nextInt, который терпит неудачу, потому что "собака" не является целым числом.

person user253751    schedule 16.03.2015

После myScanner.nextInt(); вы должны добавить myScanner.nextLine();, прежде чем читать следующие данные.

person Antony Dao    schedule 16.03.2015