Обработка ошибок ввода через 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 шт):

Автор решения: Alexandr

Вы сравниваете 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!");
    }
}
→ Ссылка
Автор решения: Alexey R.

Можете попробовать такой вариант:

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() выполняет одновременное присваивание прочитанного интового значения переменной для дальнейшего использования.

Такая запись позволяет одновременно проверить значение и "прокрутить" сканер до следующего значения в случае, если оно не является числом.

→ Ссылка