【问题标题】:For loop unusual behavior in java [closed]java中的for循环异常行为[关闭]
【发布时间】:2013-10-30 14:48:34
【问题描述】:

当我为一个会计应用程序编写代码时,我观察到了 Java 中 List 的异常行为。执行以下代码后,

List<String> accountsList = new ArrayList<String>();

    for(int i=0; i< (Integer.MAX_VALUE+2) ;i++){
        accountsList.add("Account #"+i);
    }

    System.out.println("# of accounts in list : "+accountsList.size());

输出为 - # of accounts in list : 0 ,这非常有趣。代码也可以正确运行而不会引发任何异常。如果这是因为int的值溢出,为什么java没有抛出警告/异常。

然后我将 for 循环中的条件修改为 for(int i=0; i&lt; Integer.MAX_VALUE ;i++) 并且代码按预期工作。

这种行为是否与 int 的最大值有关,因为 ArrayList 可以保存值直到 Integer.MAX_VALUE 计数(accountsList.size() 返回 int 类型的值,并且 int 定义了最大值)。

【问题讨论】:

  • 它被称为MAX_VALUE是有原因的。
  • (Integer.MAX_VALUE + 2) == (Integer.MIN_VALUE + 1) 由于整数溢出...您的结果没有什么异常。
  • 这意味着 0 &lt; (Integer.MAX_VALUE+2) 返回 false 并且您在 for 循环上获得零迭代。在你的循环中放一个System.out.print 以真正查看循环执行了多少次。
  • 好的,我明白了。但我在这里担心的是为什么 java 同时没有抛出任何警告/异常。

标签: java for-loop


【解决方案1】:

你试试这个

System.out.println((Integer.MAX_VALUE+2));

输出为 -2147483647,小于 0,因此不会将任何值添加到您的列表中。

【讨论】:

    【解决方案2】:

    当您尝试超过 MAX_VALUE 时,由于溢出,您会得到一个很大的负数。从技术上讲,这段代码没有任何违法之处,编译器/java 不会在运行前或运行时抛出警告/异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-01
      • 2013-07-30
      • 1970-01-01
      • 2021-02-20
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多