Java: бесконечный цикл внутри цикла while при попытке ограничить ввод пользователя с помощью do-while

static int prompt(set x) {
    Scanner input = new Scanner(System.in);
    do {
        System.out.println("Please enter an integer within the specified range.");
        while (!input.hasNextInt()) {
            System.out.println("Please enter a valid integer.");
            input.next();
        }
        System.out.println("input received");
        x.setVal(input.nextInt());
    } while (x.getVal() <= x.getlLim() || x.getVal() > x.getuLim());
    input.close();
    return x.getVal();
}

Предполагается, что этот метод ограничивает ввод данных пользователем определенным пользователем диапазоном целых чисел, но он продолжает цикл внутри цикла do{...}while(...), даже когда я ввожу действительные числа. Ему передается статический класс set, который инициализируется конструктором. Вот соответствующие фрагменты кода:

set конструктор:

    set(int val, int uLim, int lLim) {
        this.val = val;
        this.uLim = uLim;
        this.lLim = lLim;
    }

Инициализация set:

    set max = new set(0, 1, 99);

Затем я перехожу к prompt(max), но он продолжает говорить мне: «Пожалуйста, введите ... указанный диапазон», хотя я ввожу действительное целое число, например 60, 55 или 10. Есть ли проблемы с циклом или я что-то делаю не так в другом месте ?

Кажется, я не мог понять этого, пытался использовать регулярные выражения, блоки try-catch и parseInt в качестве альтернативы, но в итоге получил разные ошибки, поэтому я вернулся к этому простейшему методу регулирования пользовательского ввода ...


person Nameless King    schedule 04.02.2018    source источник


Ответы (2)


Условие цикла - while (x.getVal() <= x.getlLim() || x.getVal() > x.getuLim());

И вы устанавливаете uLim = 1, lLim = 99,

Очевидно, ваш "действительный" номер 1<= 60, 55, 10 <=99, поэтому цикл никогда не заканчивается.

Согласно вашему описанию, я думаю, что условие цикла должно быть while (x.getVal() >= x.getlLim() || x.getVal() < x.getuLim());

person xingbin    schedule 04.02.2018

Ваш uLim (upperLimit) ниже lLim (lowerLimit):

   set(int val, int uLim, int lLim) {
        this.val = val;
        this.uLim = uLim;
        this.lLim = lLim;
    }

Инициализирующий набор:

set max = new set(0, 1, 99);

Я бы заказывал номера по размеру, как в вашем звонке, а не в декларации.

person user unknown    schedule 04.02.2018
comment
Ах, спасибо. Значит проблема была в декларации. Я имел в виду, что uLim должно быть 99, а lLim - 1 (upperLim и lowerLim), так что, похоже, я перепутал это. - person Nameless King; 04.02.2018