7
boolean r = false ; int s = 0 ;
while (r == false) ; 
{
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
}

即使输入 3 或 123 并且循环永远不会终止,文本也不会显示自己。这里有什么问题?

4

7 回答 7

33

条件后面有一个分号。当您使用大括号为您指定一个块时,您while不使用分号。

于 2010-04-09T20:28:33.070 回答
9

去除那个 ';' 过了一阵子。

于 2010-04-09T20:28:34.557 回答
8

其他人已经指出了这个错误,但你的代码在其他方面很可怕,最终会让你绊倒:

if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
else r = true ; 

这很糟糕,因为您可以轻松地打算在iforelse子句的情况下运行多个语句。使用花括号并避免将条件语句放在一行:

if (!(s>=0 && s<=2))
{
    System.out.println ("try again not a valid response");
}
else
{
    r = true;
}

它更容易阅读,并且不太可能引入难以看到的错误。

于 2010-04-09T20:32:01.070 回答
3

而(r == 假)

应该

而(!r)

尽管其他人都说分号,但我认为这是错误的:)

于 2010-04-09T20:37:52.333 回答
3

+1 丹尼尔·迪保罗。我想我会发布一个单独的答案来澄清为什么会这样。

Java 中的 While 循环可以用两种方式之一编写。如果循环体只有一行,您可以用简写方式编写它们:

while (true)
    System.out.println("While loop");

这将在控制台上打印出“While loop”,直到程序结束。另一个选项是在大括号之间指定一个循环体,就像您在上面所做的那样:

int i = 0;
while (i < 10) {
    System.out.println("i = " + i);
    i++;
}

这将在单独的行上打印出“i = 0”、“i = 1”、...、“i = 9”。

您发布的代码会将两者混淆。在简写的 while 循环中,Java 解析器期望在 while 循环条件和分号之间找到一条语句。因为这里没有找到语句,所以while循环运行,但什么也不做;它没有身体。此外,由于循环没有主体,因此您的变量 r 没有机会采用新值;条件总是评估为真,循环永远不会退出。

如果您要在示例中否定 while 循环中的条件,即

boolean r = false ; int s = 0 ;
while (r != false) ; 
{
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
}

(注意我把错误的分号放在那里),你会发现你想要的循环体将执行一次,因为循环永远不会运行。

于 2010-04-09T20:39:04.550 回答
3

除了其他注释之外,您还应该将 if 更改为

if (s < 0 || s > 2)

这种方式更容易理解。

于 2010-04-10T01:24:19.760 回答
1

不相关的答案,我真的建议您遵循 Sun 的风格指南。

boolean r = false ; 
int s = 0 ;
while (r == false) {
    s = getInt() ; 
    if (!(s>=0 && s<=2)) {
        System.out.println ("try again not a valid response") ; 
    } else {
      r = true ;
    } 
}

如果您在它自己的循环中评估结果,您可以摆脱r变量和 if/else 条件。

int s = 0;

while( ( s = getInt() ) < 0 || s > 2 ) {
    System.out.println( "Try again, not a valid response");
}
于 2010-04-10T02:34:05.800 回答