当前位置: 首页 > 知识库问答 >
问题:

JAVA:为什么下面的无限循环终止时没有任何错误/异常[重复]

戚晨
2023-03-14

当我在eclipse中乱搞东西时,令我吃惊的是,我发现这段代码在运行时没有任何错误/异常就被终止了

public class Test {
    public static void main(String[] args) {
        for(int i = 2; i > 0; i++){
            int c = 0;
        }
    }
}

当他的代码继续执行时

public class Test {
    public static void main(String[] args) {
        for(int i = 2; i > 0; i++){
            int c = 0;
            System.out.println(c);
        }
    }
}

共有1个答案

薄欣怿
2023-03-14

首先,这两个代码段都不是无限循环,因为i一旦通过integer.max_value就会变成负数。只是跑起来需要很长时间。第一个代码段运行的时间要少得多,因为它不需要打印任何东西,而且编译器可能足够聪明,只需要优化代码并消除循环,因为它什么都不做。

测试第一个代码段,在循环前后添加system.out.println(System.CurrentTimeMillis());,得到:

1486539220248
1486539221124

即运行时间不到1秒。

稍微更改循环:

System.out.println (System.currentTimeMillis ());
for(int i = 2; i > 0; i++){
    int c = 0;
    if (i==Integer.MAX_VALUE)
        System.out.println (i);
}
System.out.println (System.currentTimeMillis ());

我有

1486539319309
2147483647
1486539319344

如您所见,i0增加到integer.max_value,然后溢出,循环在此点终止,所需时间不到1秒。

System.out.println (System.currentTimeMillis ());
for(int i = 2; i > 0; i++){
    int c = 0;
    if (i % 100000000 == 0)
        System.out.println (i);
}
System.out.println (System.currentTimeMillis ());
1486539560318
100000000
200000000
300000000
400000000
500000000
600000000
700000000
800000000
900000000
1000000000
1100000000
1200000000
1300000000
1400000000
1500000000
1600000000
1700000000
1800000000
1900000000
2000000000
2100000000
1486539563232

现在花了3秒钟。

 类似资料:
  • 我在尝试一个测试,我写了这个程序。。。 六羟甲基三聚氰胺六甲醚。。。在下面的代码中,我知道我用了“I”而不是“j”,所以为了解决这个问题,我用了这个 我在节目中遇到的问题是- 在上面的代码中,当我删除这个if块时- 这个节目无限期地进行。。。。。。。。。但当我再次放置这个if块时,程序在执行一段时间后自动终止。我也在这个链接上读到了这一点,但它展示了java的例子 它们显示了负值的原因,但在我的程

  • 问题内容: 我正在浏览旧的考试问题(当前是大学一年级),我想知道是否有人可以更彻底地解释为什么以下循环在预期的情况下不会结束。为什么会这样?我了解由于舍入错误或其他原因,它会跳过100.0,但是为什么呢? 问题答案: 数字0.1不能精确地用二进制表示,就像1/3不能精确地用十进制表示一样,因此您不能保证: 这是因为在二进制文件中: 但是,双精度数不能包含无限精度,因此,正如我们将1/3近似为0.3

  • 我希望程序在捕获异常时重新执行 while 循环 - 异常正在接收文本输入。相反,它继续使用下面的代码进行一段时间循环,我希望它再次要求用户输入。 输出:

  • 运行这段代码,我希望它增加测试变量5秒,然后完成。 然而,当我运行它时,程序并没有结束(我假设,我已经给了它合理的时间)。然而,如果我将while循环改为 程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?

  • 这是关于在服务工作者内部处理事件时的一些行为。 当在事件处理程序中调用了获取()时,获取事件似乎不会再次被触发。这实际上很好,但我仍然想知道为什么没有发生。 我看了https://developers.google.com/web/ilt/pwa/caching-files-with-service-worker#on_network_response代码如下: 我自己也尝试过这段代码,调用(就在