Я просмотрел и до сих пор не нашел «ответа» на это. Я в основном использую C ++, но некоторое время назад начал курс Java в колледже и использую его гораздо чаще. Мне было интересно, существует ли в Java что-то подобное.
while (!(cin >> var))
{
//do stuff
cin.clear();
cin.ignore(100, '\n');
}
Это повторяет цикл, когда кто-то вводит недопустимый тип в переменную, например, символ или строку, в int / double и т. Д. И затем он очищает флаг и игнорирует 100 единиц до новой строки. Если это допустимый ввод, он помещает его в переменную.
Пока все, что я придумал для Java, использует что-то вроде
while (!scanner.hasNextInt())
{
//do stuff
scanner.next();
}
var = scanner.nextInt();
Когда я пытался использовать это, иногда сообщение повторялось дважды, в зависимости от того, сколько символов я написал, и тому подобное. Это лучший способ сделать этот тип проверки ввода? Возможно, я что-то делаю не так, но должен ли этот Java-код вести себя точно так же, как в C ++ или очень похоже?
редактировать:
Попробовал еще раз, и кажется, что я делал что-то не так раньше, и метод, который я видел раньше, работает как задумано.
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int var1, var2;
System.out.println("Enter int.");
while(!scanner.hasNextInt())
{
System.out.println("Wrong input, enter integer.");
scanner.nextLine();
}var1 = scanner.nextInt();
var2 = scanner.nextInt();
System.out.println(var1 + " " + var2);
}
Это то, что я использовал. Мне нужно было получить два целых от пользователя, и я не знаю, что я делал, но это, кажется, работает.
Ключ — это то, что использует Сканер. По умолчанию \ n не является единственным разделителем, обычно любой пробел является разделителем. Вызов scanner.next () не пропускает следующий раз, он переходит к следующему «токену». Если вы хотите проигнорировать текущую строку ввода и перейти к следующей, используйте scanner.nextLine ()
Источник: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
«Сканер разбивает свои входные данные на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу».