Дилемма ввода Java Scanner. Автоматически вводит, не позволяя пользователю вводить

Большое спасибо за ответы, я, вероятно, просто добавлю дополнительные операторы input.nextLine(), чтобы поймать любые "остатки"

Итак, в этом коде я ввожу 2, и как только он переходит к оператору if, он пропускает «sCreateLogin = input.nextLine();» и переходит к следующему вводу. Возможно, потому что в Сканере что-то зависает, но я не могу понять, почему он это делает и как именно это исправить.

Если я делаю input.next(), он останавливается, но этого недостаточно, потому что, если вы случайно добавите пробел, он также пропустит следующий ввод. Я знаю, что мог бы разобрать это и т. Д., Но я все еще смущен этим.

Scanner input = new Scanner(System.in);
System.out.println("(1) Login");
System.out.println("(2) Create Account");
int iAccountOption = input.nextInt();
if(iAccountOption==2)
{
System.out.println("Input desired login: ");
String sCreateLogin = input.nextLine();
System.out.println("Input desired password: ");
String sCreatePassword = input.nextLine();
}

person anon    schedule 24.12.2010    source источник


Ответы (4)


Проблема, вероятно, заключается в токенах конца строки, которые не обрабатываются. Чтобы это исправить, после input.nextInt(); добавьте дополнительный input.nextLine(), чтобы проглотить токены конца строки:

int iAccountOption = input.nextInt();
input.nextLine();
if (iAccountOption == 2) {
   .....
person Hovercraft Full Of Eels    schedule 24.12.2010
comment
Это то, что я иногда делаю. Все еще удивляюсь, почему это происходит :0 спасибо. - person anon; 24.12.2010
comment
Как я упоминал выше, это происходит потому, что у вас есть маркеры конца строки, которые не были проглочены или обработаны, и ваш следующий вызов nextLine проглатывает эти маркеры до того, как пользователь сможет ввести какие-либо новые данные. Если вы захватите токен, отличный от nextLine, и это всегда будет новая строка, вам потребуется дополнительный вызов метода nextLine. Еще одно решение, которое, я думаю, уже упоминалось, состоит в том, чтобы захватить всю строку с помощью nextLine, а затем использовать другой объект Scanner для анализа полученной строки. - person Hovercraft Full Of Eels; 24.12.2010

Я предлагаю вам использовать любой из этих двух способов: 1. Использование класса BufferedReader 1a. Используйте класс BufferedReader и оберните его классом InputStreamReader.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
//string str = br.readLine();     //for string input
int i = Integer.parseInt(br.readLine());     // for Integer Input

1b. Теперь, когда метод readLine генерирует исключение IOException, вам нужно его перехватить. поэтому весь код будет выглядеть так.

try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
//string str = br.readLine();     //for string input
int i = Integer.parseInt(br.readLine());     // for Integer Input
}catch(IOException ioe){
ioe.PrintStackTrace();
}

2.если вы используете Java SE6 или выше, вы можете использовать класс Console

Console cons = System.console();
String str = cons.readLine("Enter name :");
System.out.print("your name :"+str);
person Mavrick    schedule 20.04.2013

Попробуйте использовать другой объект Scanner для String.

person rgksugan    schedule 24.12.2010

Он пропускал sCreateLogin, потому что у scan.nextLine() уже было значение "\r\n". Поэтому я изменил все сканеры на nextLine(). Получилось неплохо, но, возможно, это будет не лучшая идея.

package com.stackoverflow.main;

import java.util.Scanner;

public class SO4524279 {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("(1) Login");
    System.out.println("(2) Create Account");
    int iAccountOption = new Integer(scanner.nextLine());
    String sCreateLogin = "";
    String sCreatePassword = "";
    if (iAccountOption == 2) {
        System.out.println("Input desired login: ");
        sCreateLogin = scanner.nextLine();
        System.out.println("Input desired password: ");
        sCreatePassword = scanner.nextLine();
    }
    System.out.println("Login: " + sCreateLogin + "Pass: " + sCreatePassword);
}

}

Не забудьте использовать try catch для нового Integer(scanner.nextLine())

person Gondim    schedule 24.12.2010