2017-02-14 58 views
-2

我想知道为什么一个循环工作,而另一个循环虽然他们非常相似。Java - while循环表达式

dmCyl循环我想循环直到输入正整数。这是不起作用的循环。但是,hgtCyl循环会循环,直到用户输入一个int为止。看起来好像(dmCyl < 0)循环完全被忽略了。这是为什么?

另外,工作的循环是否会将hgtCyl = scnr.nextInt();放在或其外部。它的位置会改变什么吗?

谢谢!

编辑: 设置第一个while while while循环解决了这个问题。
再次感谢!
解决方案:

dmCyl = scnr.nextInt(); 

    do{ 
     System.out.print("please insert positive int"); 
     dmCyl = scnr.nextInt(); 
    }while (dmCyl < 0); 

原始代码:

int dmCyl = 0; 
int hgtCyl = 0; 

Scanner scnr = new Scanner(System.in); 

while (dmCyl < 0) { 
    System.out.print("Please enter an integer"); 
    scnr.next(); 
} 

dmCyl = scnr.nextInt(); 

这工作循环:

while (!scnr.hasNextInt()){ 
    System.out.print("Please enter an integer"); 
    scnr.next(); 
} 

hgtCyl = scnr.nextInt(); 
+3

作为一个规则,0永远不会小于0.所以你的第一个循环立即退出。 – shmosel

+1

或进入循环时dmCyl的值是什么(并且首次测试dmCyl <0') –

+0

'(dmCyl <0)'是'0 <0',它总是为false。 –

回答

4

使用做/而

do { 
    System.out.print("Please enter an integer"); 
    dmCyl = scnr.nextInt(); 
} while (dmCyl < 0); 
1

要设置dmCyl零开始,然后你告诉循环只走而它小于零。由于在启动循环的时候,它已经满足条件并且永不进入循环。改为dmCyl等于-1。

1

初始化dmCyl = 0,所以你的说法dmCyl < 0是假的..你应该尝试添加这样的事情:while (dmcyl <= 0)

1

这里从while官方描述的一部分Java Language Specification 14.12,由我标记(粗体字)的相关文字为:

通过首先评估表达式来执行语句。如果结果是布尔类型的,则会进行拆箱转换(§5.1.8)。

如果由于某种原因表达式的评估或随后的拆箱转换(如果有)突然完成,则由于相同的原因,while语句突然完成。

否则,继续执行通过基于所得到的值的选择:

  • 如果该值是真实的,则执行所包含的语句。然后有一个选择:

    • 如果语句的执行正常完成,那么整个while语句再次执行,通过重新计算表达式开始。

    • 如果执行语句突然完成,请参阅§14.12.1。

如果(可能拆箱)表达式的值是假的,没有进一步采取行动和while语句正常完成。

也就是说,表达式检查之前执行用于第一次循环的内容。如果结果为false,则内容不会执行并且循环终止。