Java布尔while循环 - 评估否定

时间:2017-02-07 07:12:33

标签: java while-loop boolean-logic boolean-expression

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

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;
    }

我显然读错了,因为代码可以正常工作,直接来自一本书,但我评估的方式是:

done = false,

while(done = true)

[代码]

else done = true

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

2 个答案:

答案 0 :(得分:2)

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

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为false,因此!done为真,所以while循环开始。

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

(3)将done设为true。

现在让我们假设代码执行已经到了while循环的末尾。 (1)再次执行。这一次,done为真,因此!done为假。如果while循环中的条件为false,则while循环停止迭代,并且直接执行while循环下面的代码。

  

所以看起来这会创建一个无限循环

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

答案 1 :(得分:0)

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

让我们来看看。

done启动false。您需要条件while (!done)中的布尔表达式。布尔表达式必须求值为true才能执行循环体。 !done =&gt;第一次!false!false的价值是多少?这是true!因此表达式求值为true并且循环体执行。