Обработка ошибок ввода через Scanner
Не могу додумать нормальное условие в цикле while для того чтобы программа "фильтровала" ввод пользователя. Допускается ввод числа 36 и 52. Все остальное должно отсеиваться и программа заново предлагает пользователю ввести число. Заранее благодарю за любую подсказку в этом вопросе. Как лучше сделать так чтобы и кода было не много и визуально все понятно?
public static int checkCountCard() {
int countCards;
System.out.print("Please input count of cards (36 or 52): ");
while (!(in.hasNextInt() && (in.equals(36) || in.equals(52)))) {
System.out.println("Error, input int-value!");
System.out.print("Please input count of cards (36 or 52): ");
in.nextLine();
}
countCards = in.nextInt();
return countCards;
}
Ответы (2 шт):
Вы сравниваете Scanner с числами 36 и 52, что является неправильным и будет всегда false. Вариантов кода решающих Вашу задачу можно написать несколько.
Скорее всего меня сейчас закидают тапками за while(true), но на мой взгляд наиболее сокращенный и понятный код выглядел бы так:
while (true) {
System.out.print("Please input count of cards (36 or 52): ");
if (in.hasNextInt()) {
int value = in.nextInt();
if (value == 36 || value == 52) {
return value;
}
System.out.println("Error, input int-value!");
}
}
Можете попробовать такой вариант:
public static int checkCountCard(){
int count = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("Please input count of cards (36 or 52): ");
while (!Arrays.asList(new Integer[]{36, 52})
.contains(scanner.hasNextInt() ? count = scanner.nextInt() : scanner.next())){
System.out.println("Error, input int-value!");
System.out.print("Please input count of cards (36 or 52): ");
}
return count;
}
Без бесконечного цикла и весьма наглядно. Т.е. вот как работает логика:
Мы говорим, что пока в элементы массива не попадает значение из сканера, мы считаем ввод ошибочным. Значение из сканера мы читаем так: scanner.hasNextInt() ? count = scanner.nextInt() : scanner.next(), что есть короткая запись if-else выражения где count = scanner.nextInt() выполняет одновременное присваивание прочитанного интового значения переменной для дальнейшего использования.
Такая запись позволяет одновременно проверить значение и "прокрутить" сканер до следующего значения в случае, если оно не является числом.