java中for循环的特殊行为

时间:2015-12-07 05:02:14

标签: java for-loop

今天在阅读拳击和自动拳击时,我想出了一个场景,并发现了我被困在无限循环中的特殊行为。

我检查了两次代码,但没有发现任何错误。 如果有人可以看,并建议我在哪里做错了,这样我就会出现这个无限循环

请找到以下代码。

public class InTheLoop {

public static final int END = Integer.MAX_VALUE;
public static final int START = END - 100;

public static void main(String[] args) {
    int count = 0;
     //Infinite loop starts.
    for (int i = START; i <= END; i++) {
        count++;
        System.out.println(count);
    }

 // This never got printed.
    System.out.println("hi I am out of for loop" +count);
  }
}

4 个答案:

答案 0 :(得分:4)

请注意,您的END等于Integer可以容纳的最大可能值(值为2147483647)。这意味着对于i可能持有的任何值,i <= END始终为真。当i实际到达2147483647时,它仍为<= END。在下一次迭代中,您尝试将其递增1,这会导致溢出,i变为-2147483648,仍然是<= END,并且循环将永远继续。

答案 1 :(得分:2)

因为你设置了 i&lt; = END , 一旦达到Integer.MAX_VALUE,就会执行increment(i ++),这使得它为-2147483648(Integer.MAX_VALUE + 1)。

这就是为什么它没有破坏并继续运行。

改变,

 for (int i = START; i <= END; i++) {

for (int i = START; i < END; i++) {

将解决。

答案 2 :(得分:1)

for (int i = START; i <= END; i++) { ==&gt;这里i <= END;是罪魁祸首。

当循环运行时,i在每次迭代时递增1,然后将其与end进行比较。所以,

  

最初 - i = 2147483547

一旦i到达2147483647(Integer.Max_VALUE),它再次递增1,所以,你得到溢出和循环

这样的事情发生了:

2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646.

将您的代码更改为:for (int i = START; i < END; i++) {

答案 3 :(得分:0)

START值为2147483547 您已将其迭代为END2147483647

START到达2147483647后,它以-2147483648

开头

这是程序中的整数溢出。由于int数据类型在Java中是32位,因此任何超过32位的值都会被翻转。在数值方面,它表示在Integer.MAX_VALUE(2147483647)上递增1后,返回的值将为-2147483648。发生这种情况时,JVM不会发出警告或异常。

这已经在Java 8中处理了溢出时抛出ArithmeticException检查this&amp; this