Java 布尔 while 循环 - 求反

Java Boolean while loop - Evaluating a negation

我是 Java 的初学者,虽然我认为我对布尔逻辑相当了解,但我被这个 while 循环绊倒了:

boolean done = false;
while(!done) {
    String answer = JOptionPane.showInputDialog(null, "message");

    if (answer == null) finish();

    try {
        sales = Double.parseDouble(answer);
        if (sales<= 0) throw new NumberFormatException();
        else done = true;
    }

我显然读错了,因为代码有效并且直接取自一本书,但我评估它的方式是:

完成=错误,

同时(完成 = 真)

[代码]

其他完成=真

所以看起来这会创建一个无限循环(或者根本不会启动 while 循环),但事实并非如此。有人可以帮忙解释一下吗?

您将循环条件误读为while (done = true),这与实际含义相反(并且使用了错误的运算符)。您不会将布尔值与布尔值进行比较;用技术术语来说,这是一个愚蠢的行为。您也不要为条件表达式中的循环变量赋值,因为这会导致麻烦,并且不是您想要的。

让我们来看看它。

done 开始 false。您需要在条件 while (!done) 中使用布尔表达式。布尔表达式的计算结果必须为 true 才能执行循环体。 !done => !false 第一次。 !false 的值是多少?是true!所以表达式的计算结果为 true 并且循环体执行。

让我们给重要的行一些行号:

while(!done) // (1)
{
    String answer = JOptionPane.showInputDialog(null, "message");

    if (answer == null) finish();

    try
    {
        sales = Double.parseDouble(answer); // (2)
        if (sales<= 0) throw new NumberFormatException();
        else done = true; // (3)
    }

(1)先执行,done为假,所以!done为真,于是while循环开始。

(2) 获取用户输入,假设它大于 0,则转到 (3)。

(3) 将 done 设置为真。

现在假设代码执行已经到达 while 循环的末尾。 (1) 再次执行。这次,done 为真,因此 !done 为假。如果while循环中的条件为假,while循环停止迭代并执行while循环正下方的代码。

So it would seem that this would create an infinite loop

如果您输入大于或等于 0 的数字,则不会。正如我刚才所说,大于 0 的数字将导致 while 循环停止。如果您一直输入负数,done 将一直为假,因此 !done 一直为真。结果,while 循环永远不会停止。