Бесконечный цикл while с логической переменной в Java

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

В любом случае, я пишу базовую программу на Java, используя логическую переменную и цикл while. Код, мягко говоря, очень «неуклюжий», и его определенно можно было бы сделать намного более элегантным (хотя и не с моим ограниченным набором навыков, так что еще раз приносим свои извинения). Если логическая переменная имеет значение true, код работает должным образом. Однако, если переменная ложна, код переходит в цикл while, и даже если вводится вход, который должен сделать утверждение истинным, цикл просто продолжается. Любые идеи, что вызывает этот бесконечный цикл. Я практически уверен, что это что-то основное, но я просто не могу понять это. Вот код ниже. Спасибо!

import java.util.Scanner;
import java.util.Random;
import static java.lang.System.out;
import static java.lang.System.in;

public class MB1 {
    public static void main(String args[]){
        char a, b, c, d;
        Scanner myScanner = new Scanner(in);
        boolean secondBoolean;

        out.println("Let's get started! Type in your 4-digit code:");
        a = myScanner.findWithinHorizon(".", 0).charAt(0);
        b = myScanner.findWithinHorizon(".", 0).charAt(0);
        c = myScanner.findWithinHorizon(".", 0).charAt(0);
        d = myScanner.findWithinHorizon(".", 0).charAt(0);

        secondBoolean = ((a == '1'|| a == '2'|| a == '3' || a == '4' || a == '5' || a == '6' || a == '7')
            && (b == '1' || b == '2'|| b == '3' || b == '4' || b == '5' || b == '6' || b == '7')
            && (c == '1' || c == '2'|| c == '3' || c == '4' || c == '5' || c == '6' || c == '7')
            && (d == '1' || d == '2'|| d == '3' || d == '4' || d == '5' || d == '6' || d == '7'));

            while (secondBoolean == false) {
            out.println("The code you typed is not valid. Please type a different code:");
            a = myScanner.findWithinHorizon(".", 0).charAt(0);
            b = myScanner.findWithinHorizon(".", 0).charAt(0);
            c = myScanner.findWithinHorizon(".", 0).charAt(0);
            d = myScanner.findWithinHorizon(".", 0).charAt(0);  
            out.print(a);out.print(b);out.print(c);out.print(d);
            } 
            if (secondBoolean == true){
                out.println('0');
            }
        }
    }

person user3499940    schedule 04.04.2014    source источник
comment
Примечание: это логическое выражение действительно уродливо и трудно читаемо. Я бы поменял на secondBoolean = a >= '1' && a <= '7' || b >= '1' && b <= '7' || c >= '1' && c <= '7' || d >= '1' && d <= '7'   -  person BackSlash    schedule 05.04.2014
comment
Отступ вашего кода выключен.   -  person David Conrad    schedule 05.04.2014
comment
Уже есть достаточно ответов на вашу проблему с бесконечным циклом, я просто могу предложить использовать цикл do while, чтобы уменьшить избыточность вашего кода (повторяя часть ввода и логического назначения)   -  person Serhiy    schedule 05.04.2014


Ответы (4)


Вы находитесь в бесконечном цикле, потому что вы никогда не меняете значение secondBoolean. Вы должны сделать это внутри цикла while.

Кроме того, не забудьте инициализировать переменную secondBoolean перед циклом (установив secondBoolean = false, чтобы ваш цикл запустился хотя бы один раз).

person Elvis Fernandes    schedule 04.04.2014

Значение переменной secondBoolean необходимо каждый раз пересчитывать.

Заменять

secondBoolean = ((a == '1'|| a == '2'|| a == '3' || a == '4' || a == '5' || a == '6' || a == '7')
        && (b == '1' || b == '2'|| b == '3' || b == '4' || b == '5' || b == '6' || b == '7')
        && (c == '1' || c == '2'|| c == '3' || c == '4' || c == '5' || c == '6' || c == '7')
        && (d == '1' || d == '2'|| d == '3' || d == '4' || d == '5' || d == '6' || d == '7'));

while (secondBoolean == false) {
    out.println("The code you typed is not valid. Please type a different code:");
    a = myScanner.findWithinHorizon(".", 0).charAt(0);
    b = myScanner.findWithinHorizon(".", 0).charAt(0);
    c = myScanner.findWithinHorizon(".", 0).charAt(0);
    d = myScanner.findWithinHorizon(".", 0).charAt(0);  
    out.print(a);out.print(b);out.print(c);out.print(d);
    } 
    if (secondBoolean == true){
        out.println('0');
    }
}

с участием

while (secondBoolean == false) {
    out.println("The code you typed is not valid. Please type a different code:");
    a = myScanner.findWithinHorizon(".", 0).charAt(0);
    b = myScanner.findWithinHorizon(".", 0).charAt(0);
    c = myScanner.findWithinHorizon(".", 0).charAt(0);
    d = myScanner.findWithinHorizon(".", 0).charAt(0); 

    out.print(a);out.print(b);out.print(c);out.print(d);

    secondBoolean = ((a == '1'|| a == '2'|| a == '3' || a == '4' || a == '5' || a == '6' || a == '7')
        && (b == '1' || b == '2'|| b == '3' || b == '4' || b == '5' || b == '6' || b == '7')
        && (c == '1' || c == '2'|| c == '3' || c == '4' || c == '5' || c == '6' || c == '7')
        && (d == '1' || d == '2'|| d == '3' || d == '4' || d == '5' || d == '6' || d == '7'));
    } 
    if (secondBoolean == true){
        out.println('0');
    }
}

Вы должны обновлять значение secondBoolean на каждой итерации цикла.


Кроме того, вы можете улучшить читаемость своего кода, заменив его на

String choices = "1234567";
secondBoolean = choices.contains(a + "") && choices.contains(b + "")
             && choices.contains(c + "") && choices.contains(d + "");

Удачи

person Tanmay Patil    schedule 04.04.2014

Вы можете попробовать просто прочитать ввод пользователя в виде строки и разделить ее на "."

import java.util.Scanner;

import static java.lang.System.in;
import static java.lang.System.out;

public class MB1 {

    public static void main(String args[]) {
        char a, b, c, d;
        Scanner myScanner = new Scanner(in);
        boolean secondBoolean;

        out.println("Let's get started! Type in your 4-digit code:");
        String strIn = myScanner.nextLine();

        // Split input by "."
        String[] strAry = strIn.split("\\.");

        // create char array of equal length to String array
        char[] chrAry = new char[strAry.length];

        // convert strings to chars
        for (int i = 0; i < strAry.length; i++) {
            chrAry[i] = strAry[i].charAt(0);
        }

        // (unnecessary) assignment to a, b, c and d
        a = chrAry[0];
        b = chrAry[1];
        c = chrAry[2];
        d = chrAry[3];

        secondBoolean = ((a == '1' || a == '2' || a == '3' || a == '4' || a == '5' || a == '6' || a == '7')
                && (b == '1' || b == '2' || b == '3' || b == '4' || b == '5' || b == '6' || b == '7')
                && (c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7')
                && (d == '1' || d == '2' || d == '3' || d == '4' || d == '5' || d == '6' || d == '7'));

        while (!secondBoolean) {
            out.println("The code you typed is not valid. Please type a different code:");
            // ... read in code again. You possibly want to do this with a method
        }
        if (secondBoolean) {
            out.println('0');
        }
    }
}
person baeda    schedule 04.04.2014

Да, вы входите в цикл, когда secondBoolean ложно. Вы будете ходить по кругу в этом цикле до тех пор, пока secondBoolean не будет установлено в true, поэтому вы должны обновить это в цикле while.

С другой стороны, возможно, ваш код можно было бы немного привести в порядок;

List<String> nums = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
secondBoolean=(nums.contains(a) && 
               nums.contains(b) && 
               nums.contains(c) && 
               nums.contains(d));

Я только начинаю java, но это выглядит немного опрятнее! Надеюсь, это помогло.

person Críostóir Ó Catháin    schedule 04.04.2014