java do while循环在条件满足后保持循环

Aug*_*mae 1 java loops do-while

我是一名新的java程序员,我正在编写一个程序,为3台打印机设置3个型号.如果用户输入了错误的值,我希望它继续向用户询问型号.我得到了它的工作,但只有当用户的第一个值在3个打印机之一的数字之间.如果第一个值不是可能值之一而第二个输入是,它仍然会重复循环.

package printing;

import java.util.Scanner;

public class newClass {

    public static void main(String[] args) {

        int count = 0;

        String machine1 = "546";
        String machine2 = "892";
        String machine3 = "127";


        Scanner s = new Scanner(System.in);

        System.out.print("Model Number:");
        String modelNumber = s.nextLine();
        // increment count if first input value is wrong
        if (!s.equals(machine1) || !s.equals(machine2) || !s.equals(machine3))
            count++;

        // if user inputs right value
        while (true) {
            if (modelNumber.equals(machine1)) {
                System.out.println("Machine 1 is online");
                break;
            }
            if (modelNumber.equals(machine2)) {
                System.out.println("Machine 2 is online");  
                break;
            }
            if (modelNumber.equals(machine3)) {
                System.out.println("Machine 3 is online");
                break;
            }

            // keep looping if user does not input values for machine1, machine2 or machine3
            do {
                System.out.println("Try again");
                System.out.print("Model Number:");
                String modelNumberFalse = s.nextLine();
                /* each time user gets value wrong the count variable goes up by 1 and
                   the loop breaks when count reaches 3 */
                count++;
                if (count == 3)
                    break;
            } while (!s.equals(machine1) || (!s.equals(machine2)) || (!s.equals(machine3)) && (count < 2));

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,每次用户输入错误的值时,我希望count变量增加,直到达到3并且do while循环中断,但是在我输入错误的值超过3次之后它仍然要求输入型号.

Nat*_*hes 6

有几个问题.这条线错了:

while(!s.equals(machine1) || (!s.equals(machine2)) || (!s.equals(machine3)) && (count < 2));
Run Code Online (Sandbox Code Playgroud)

s是一个扫描仪,而不是一个字符串,这不是一个有效的比较.替换modelNumbers得出:

while(!modelNumber.equals(machine1) || (!modelNumber.equals(machine2)) || (!modelNumber.equals(machine3)) && (count < 2));
Run Code Online (Sandbox Code Playgroud)

除非modelNumber,machine1,machine2和machine3都是相同的值,否则这不能为false.

此外,测试计数会弄乱这一点并且是多余的,因为您正在测试它并在循环内打破.

它应该是

while(!modelNumber.equals(machine1) 
    && (!modelNumber.equals(machine2)) 
    && (!modelNumber.equals(machine3)));
Run Code Online (Sandbox Code Playgroud)

德摩根定律.应用此规则给出

while(!(modelNumber.equals(machine1)
    || modelNumber.equals(machine2)
    || modelNumber.equals(machine3)))
Run Code Online (Sandbox Code Playgroud)

这可能更容易阅读.

另外,如果你用"return"代替"break",随着对do-while条件的改变,它起作用.所以还有其他事情要发生.在内部执行中调用break会导致控制返回到外部while循环的顶部.添加在中断之前设置的布尔标志以及在外部while循环中测试的布尔标志将是解决此问题的一种方法.或者只是使用return.