这个while循环有什么问题?

时间:2010-04-09 20:27:18

标签: java while-loop infinite-loop

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并且循环永不终止,文本也不会显示。这有什么不对吗?

7 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:9)

删除';'过了一会儿。

答案 2 :(得分:8)

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

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

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

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

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

答案 3 :(得分:3)

while(r == false)

应该是

而(!r)的

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

答案 4 :(得分:3)

给丹尼尔迪保罗+1。我想我会发布一个单独的答案来澄清为什么就是这种情况。

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

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

这将在控制台上打印出“While循环”,直到程序结束。另一个选项是在大括号之间指定一个循环体,如上所述:

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

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

您发布的代码会使两者混淆。在简短的while循环中,Java解析器期望在while循环条件和分号之间找到一个语句。因为它在这里找不到语句,所以while循环运行,但什么都不做;它没有身体。此外,因为循环没有主体,所以变量r没有机会假设一个新值;条件总是计算为true,循环永不退出。

如果你要在你的例子中否定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 ; 
}

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

答案 5 :(得分:3)

除了其他评论之外,您还应将if更改为

if (s < 0 || s > 2)

这种方式更容易理解。

答案 6 :(得分: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");
}