Проверка целого и целого диапазона в java

#java

#java

Вопрос:

Я работал над этой простой проблемой в течение нескольких часов и ничего не добился. Я пытаюсь проверить, что число, введенное в мою программу, находится в диапазоне от 1 до 12. Я пробовал несколько видов циклов, но получаю различные ошибки и проблемы, которые я подробно описал в комментариях в верхней части примера кода:

 //This gives me an error saying that the local variable deptMonth may not have
//been initialized

boolean monthCorrect;
int deptMonth;
Scanner input = new Scanner(System.in); 

    do
    {
        System.out.print("Please input the month (1-12): ");
        if (input.hasNextInt())
        {
            if ((input.nextInt()) <= 12 amp;amp; (input.nextInt()) >=1)
            {
                deptMonth = input.nextInt();
                monthCorrect = true;
            }
            else
            {
                System.out.println("I don't understand try again.");
                monthCorrect = false;
                input.next();
            }
        }
        else
        {
            System.out.println("I don't understand try again.");
            monthCorrect = false;
            input.next();
        }

    }while (!(monthCorrect));
  

Есть ли более простой и правильный способ сделать это?

Спасибо.

Комментарии:

1. ((input.nextInt()) <= 12 amp;amp; (input.nextInt()) >=1) — не делайте этого. Если вы вызовете nextInt() дважды, ваша программа попытается прочитать два отдельных числа. Вызовите его один раз и присвоите переменной.

Ответ №1:

Вы вызываете метод nextInt повторно. Разве это не поглотит несколько входных токенов? Попробуйте это: вызовите nextInt только один раз и присвоите это переменной, давайте назовем ее foo . Затем проверьте foo , находится ли оно в правильном диапазоне, и если да, назначьте foo deptMonth .

Ответ №2:

Как сказал Роберт, вам нужно присвоить input.nextInt()
переменной внутри цикла do . Многократный вызов этого метода приводит к тому, что вам приходится вводить значение несколько раз. Итак, для того, чтобы ваш код работал, он должен выглядеть примерно так:

 boolean monthCorrect;
int deptMonth;
Scanner input = new Scanner(System.in); 

do
{
    System.out.print("Please input the month (1-12): ");
    if (input.hasNextInt())
    {
        int tmp = input.nextInt();
        if ((tmp) <= 12 amp;amp; (tmp) >=1)
        {
            deptMonth = tmp;
            monthCorrect = true;
        }
        else
        {
            System.out.println("I don't understand try again.");
            monthCorrect = false;
        }
    }
    else
    {
        System.out.println("I don't understand try again.");
        monthCorrect = false;
    }

}while (!(monthCorrect));
  

Кроме того, я не знаю, продолжаете ли вы ввод или нет, но рекомендуется закрывать сканер, как только вы закончите с ним, чтобы предотвратить проблемы с памятью и тому подобное.

Итак,

 if ((tmp) <= 12 amp;amp; (tmp) >=1)
        {
            deptMonth = tmp;
            monthCorrect = true;
        }
  

Должно выглядеть так:

 if ((tmp) <= 12 amp;amp; (tmp) >=1)
        {
            deptMonth = tmp;
            monthCorrect = true;
            input.close();//This keeps everything tidy! Also eclipse should give you a warning message if you forget to include it!
        }
  

Комментарии:

1. Я думаю, вам следует проверить это в случае, когда пользователь вводит что-то, что не является числом. Мне кажется, что вы попадете в бесконечный цикл.

2. На самом деле, я использовал input.nextInt() , поэтому он будет блокироваться до тех пор, пока не будет введено ЦЕЛОЕ число. Но спасибо за -1, приятель, очень приятно.