黑马程序员技术交流社区

标题: JVM执行完一段代码停顿几秒后疯狂打压,求解 [打印本页]

作者: 刁镜元    时间: 2013-8-15 00:56
标题: JVM执行完一段代码停顿几秒后疯狂打压,求解
本帖最后由 刁镜元 于 2013-8-15 21:03 编辑

class Demo6{
        public static void main(String[] args){        
                int x =1;
                while(true){
                        if(x<10){
                                System.out.println(x);
                        }
                        x++;
                }
        }
               
}
编译执行,JVM为什么在停顿几秒后疯狂打印,这难道是传说中的bug?
求一合理解释


作者: 夜空闪亮    时间: 2013-8-15 01:31
因为你这个程序是个死循环,在循环中x++这句代码是每一次循环都要执行的,所以当打印1-------9后,x仍在不断的进行++,而计算机的执行速度是非常快的,间隔了一会x的值已经被自动加至int型值可以存储的最大正整数值2147483641(int型的表示范围为:2147483641~-2147483648),此时将发生数据错误,在内存中数据经过进位后将正好变成整形所能表示的负数最小值,此时就又满足了x<10 的条件,所以此时会打印负数,并且是从-2147483648开始打印的。楼主可以可以仔细看看打印的数就会明白了。
作者: masterV    时间: 2013-8-15 02:33
楼主的while(true)是一个死循环,在java中,用二进制的最高位来表示数值的正负,0为正,1为负。int类型的取值范围是(-2^32到2^32-1),当x的值达到最大值的时候再自增一次就会得到int最小值,即-2147483648(-2^32),满足x<10的条件,所以会继续输出。
可以让线程打印前休眠1秒钟查看打印结果。
代码如下:
  1. class Demo6
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 int x = 1;
  6.                 while (true)
  7.                 {
  8.                         if (x < 10)
  9.                         {
  10.                                 Thread.sleep(1000);
  11.                                 System.out.println(x);
  12.                         }
  13.                         x++;
  14.                 }
  15.         }

  16. }
复制代码

作者: EYE_SEE_YOU    时间: 2013-8-15 09:48
循环语句没有结束语句,你不把机子烧了还想干嘛
作者: 薛鹏鹏    时间: 2013-8-15 10:32

亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~


保持队形,谢谢合作
作者: 刁镜元    时间: 2013-8-15 23:25
薛鹏鹏 发表于 2013-8-15 10:32
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~

不好意思,白天上课,教室没网。晚上回来才看到
作者: 张俊生    时间: 2013-8-15 23:45
同桌一起加油!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2