这个while循环有什么问题?

Dav*_*vid 7 java infinite-loop while-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 ; 
}
Run Code Online (Sandbox Code Playgroud)

即使输入3或123并且循环永不终止,文本也不会显示.这里有什么不对?

Dan*_*olo 33

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

  • 呵呵......`while(r == false)/*DOHING*/;` (5认同)
  • 确实.那就是问题所在 (2认同)

Ale*_*lex 9

除掉 ';' 过了一阵子.


Jon*_*ust 8

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

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

这很糟糕,因为在ifor else子句的情况下,你可以很容易地打算运行多个语句.使用花括号并避免将条件语句放在一行上:

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

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

  • 虽然我经常在一条线上留下支架,但我不能捍卫这种做法.事实上,那里的牙箍几乎没有任何成本,即使他们以某种方式将你甩了一下,再看一遍也不到一秒钟.另一方面,让他们离开 - 甚至说一千个"if"语句(假设你已经写了一段时间然后再回到C语言),如果你碰巧搞砸了它可能需要几分钟还是需要几个小时才能解决 - 这是不可原谅的,而且显然是错误的.然而,我经常让他们离开... (5认同)
  • 当人们说"我永远不会回来并犯这个错误"这样的话时,我喜欢它.因为可能不是你回到代码中,并且在任何情况下,几个月前编写的代码可能是由其他人编写的. (3认同)
  • 我不同意使用花括号.如果是单一陈述,那就是单一陈述.作为一种风格问题,我会缩进但不会使用curlies作为单一陈述......但这是一场宗教斗争. (2认同)
  • @Atomiton绝对,我更喜欢一直使用它们,因为我很可能会在某个时候回来改变它,这就是当我没有把它们放在那里时我会搞砸的时候.至少把它们放在另一条线上 - 我希望我们能够同意:) (2认同)