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并且循环永不终止,文本也不会显示。这有什么不对吗?
答案 0 :(得分:33)
条件之后你有一个分号。当您使用大括号为while
指定块时,不要使用分号。
答案 1 :(得分:9)
删除';'过了一会儿。
答案 2 :(得分:8)
其他人已经指出了这个错误,但是你的代码在其他方面是可怕的,最终会让你失望:
if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ;
else r = true ;
这很糟糕,因为在if
或else
子句的情况下,您可以轻松地打算运行多个语句。使用花括号并避免将条件语句放在一行:
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");
}