我是一名新的 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));
}
}
}
此外,每次用户输入错误的值时,我都希望 count 变量递增,直到它达到 3 并且 do while 循环中断,但在我输入错误值超过 3 次后它会继续询问型号。
最佳答案
有几个问题。这行是错误的:
while(!s.equals(machine1) || (!s.equals(machine2)) || (!s.equals(machine3)) && (count < 2));
s
是扫描仪,不是字符串,这不是有效的比较。将 modelNumber
替换为 s
得到:
while(!modelNumber.equals(machine1) || (!modelNumber.equals(machine2)) || (!modelNumber.equals(machine3)) && (count < 2));
这不能为假,除非 modelNumber、machine1、machine2 和 machine3 都是相同的值。
同时测试 count 会把事情搞砸,而且是多余的,因为您正在测试它并在循环中中断。
应该是
while(!modelNumber.equals(machine1)
&& (!modelNumber.equals(machine2))
&& (!modelNumber.equals(machine3)));
参见 DeMorgan's Laws .应用此规则给出
while(!(modelNumber.equals(machine1)
|| modelNumber.equals(machine2)
|| modelNumber.equals(machine3)))
这可能更容易阅读。
另外,如果您用“return”代替“break”;随着对 do-while 条件的更改,它起作用了。所以还有其他事情正在发生。在内部 do-while 中调用 break 会使控制返回到外部 while 循环的顶部。添加一个在中断之前设置并在外部 while 循环中测试的 boolean 标志将是解决此问题的一种方法。或者只使用返回。
关于java do while loop 在满足条件后一直循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31548877/