Как вы инициализируете переменную внутри цикла - PullRequest
0 голосов
/ 03 июня 2019

Предполагается, что мой код будет зацикливаться до тех пор, пока не будет введен действительный ввод, то есть: если будет дана буква, он зациклится, но если задано правильное число, код должен сохранить его в cSec.Есть ли способ сделать это?

    byte cSec;
    boolean contCSec = true;
    while(contCSec == true) {
        System.out.println("Enter course section: ");
            cSec = sc.nextByte();
        if(cSec>0)
            contCCode = false;
    }

cSec нельзя использовать вне цикла.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

В дополнение к замечательному ответу другого Дейва, вы можете подавить предупреждение компилятора, инициализируя cSec вне цикла.

byte cSec = 0;
boolean contCSec = true;
while(contCSec == true) {
    System.out.println("Enter course section: ");
        cSec = sc.nextByte();
    if(cSec>0)
        contCSec = false;
}

Причина, по которой вы получаете предупреждение без первого объявления, заключается в том, чтоКак ни странно, компилятор не анализирует содержимое вашего логического значения в while(contCSec == true).Он видит, что есть цикл while, и видит, что будет логическое значение, полученное в результате (contCSec == true), но что касается компилятора, любое логическое значение, входящее в ваше условие while, может быть истинным или ложным,Это означает, что вы можете войти в цикл while, или вы могли бы ... нет.

Что касается компилятора, то все, что находится внутри цикла while, может происходить или не происходить, и нет никакого способазнать без фактического запуска кода.(Если вы хотите знать, почему на самом деле это строгое ограничение для компьютеров, проверьте проблему остановки .) Это означает, что компилятор понятия не имеет, произойдет ли cSec = sc.nextByte(); или нет.Отсюда и предупреждение.

0 голосов
/ 04 июня 2019

Довольно менее многословная форма того, что вы написали, может быть:

byte cSec; 
do {
   System.out.println("Enter course section: ");
   cSec = sc.nextByte();
 } while (cSec <= 0);

, где 'cSec <= 0' обозначает недопустимое значение, согласно вашему оригиналу, хотя я полагаю, что есть больше проверки, чем это.</p>

Это не соответствует вашему названию (инициализировать в цикле), так как для меня это именно то, что вы не хотите делать.

Я думаю, что это яснее, чем ваш оригинал, поскольку в нем нет флагазначения, и цикл do ... while показывает природу 'спроси потом решай цикл' немного лучше.

Добавление дополнительной проверки:

byte cSec; 
do {
   System.out.println("Enter course section: ");
   try {
       cSec = sc.nextByte();
   }
   catch (InputMismatchException ex) {
       System.out.println("A number is required");
       cSec = -1;
   }
 } while (cSec <= 0);
...