我是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循环),但事实并非如此。有人可以帮忙解释一下吗?
答案 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
并且循环体执行。