Как инициализировать переменную в цикле do while, не передавая значение до закрытия цикла?

Я писал программу, которая требует ввода числа от 1 до 4. Чтобы предотвратить ввод чисел за пределами диапазона. Однако переменная продолжает переходить к другому фрагменту кода и приводит к сбою программы. Это цикл do while:

        do
    {
        System.out.println("Please enter a quarter number 1-4: ");
        quarter = scanIn.nextInt();     
    }while((quarter > 5 ) && (quarter < 0));

Это фрагмент кода, который запускает переменную:

        for (int n = ((quarter * 3)-3); n < (quarter*3); n++)
    {
        String sum = fmt.format(monthSales[n]);
        System.out.printf("Sales for month %d: %s\n", n+1, sum);
    }

Это ошибка, которая возвращается при неправильном вводе:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -6
at lab4.Lab4.main(Lab4.java:57)

Я попытался ограничить область действия «четверти» только внутри цикла, но тогда предложение while не работает. Как я могу предотвратить передачу переменной до закрытия цикла? p.s. Эта проблема является частью задания, поэтому я должен использовать цикл do while.


person Logan Henry    schedule 10.02.2015    source источник
comment
Во-первых, вы разрешаете QuarterNum быть 0 или 5, даже если вы говорите, что хотите, чтобы оно было 1-4, а во-вторых, ваш цикл do-while станет бесконечным, если пользователь вводит что-нибудь, кроме числа. Посмотрите почти неограниченное количество предыдущих вопросов о Scanner и nextInt, чтобы узнать, почему. Кроме того, какова связь между quarterNum и quarter?   -  person David Conrad    schedule 11.02.2015
comment
Где используется цикл for? что такое четверть?   -  person Vivin    schedule 11.02.2015
comment
Программа рассчитывает общие суммы за один финансовый квартал. QuarterNum - это новая переменная, которую я ввел в попытке предотвратить передачу переменной (unsuccsessfull, код будет отредактирован). как я могу настроить его, чтобы он продолжался, пока ввод не равен 1-4?   -  person Logan Henry    schedule 11.02.2015


Ответы (1)


Я вижу в вашем коде одну вещь:

Условие «делать / пока» кажется неправильным. Если ваше намерение, как я понял, продолжать спрашивать пользователя, пока он / она не сообщит действительный квартал от 1 до 4, условие должно быть примерно таким:

do {
  // ...
} while (quarterNum < 1 || quarterNum > 4);

Если я предполагаю, что четверть получает значение QuarterNum в некотором промежуточном коде, вторая часть кажется правильной, и исключение должно возникать только в том случае, если четверть не является допустимым значением (-1, чтобы быть точным). Исправить условие do / while больше невозможно.

Я не понимаю, где ограничивающие области действия переменных могут иметь какое-либо отношение к вашей проблеме. (и я даже не понимаю, что вы имеете в виду, говоря «запретить [ing] передачу переменной, пока цикл не закроется»).

Я надеюсь, что смогу вам помочь.

person helenov    schedule 10.02.2015
comment
Спасибо, что сделали свое дело! Вы были правы в предположении, что квартал и квартал приравниваются. - person Logan Henry; 11.02.2015