【问题标题】:Array index out of bounds: 30 (Java)数组索引越界:30 (Java)
【发布时间】:2013-11-03 17:30:17
【问题描述】:

我正在编写一个程序,将用户输入的整数打印成二进制形式。 当我运行它并输入数字 5 时,它崩溃并给我错误:
java.lang.ArrayIndexOutOfBoundsException:30 在 PrintBinaryDigitsFixed.main(PrintBinaryDigitsFixed.java:27) 即行“digits[counter] = number % 2;”

为什么会出现越界异常?它应该将余数分配给第一个元素,然后再转移到第二个元素,不是吗?

我觉得我犯了一个明显的错误,但我不知道是什么

 final int MIN = 0;
    final int MAX = (int) (Math.pow(2, 30) - 1);
    int[] digits = new int[30];                 //array to hold the digits

    int number = readInput
        ("Enter an integer from " + MIN + " to " + MAX, MIN, MAX);
    int counter = 0;
    int modNumber = 2;



    while(modNumber / 2 != 0)
    {
        digits[counter] = number % 2;
        modNumber = number / 2;
        counter++;
    }
    System.out.print(number + " in binary form is ");
    listBackwardsFrom(digits, counter);

谢谢

【问题讨论】:

  • 如果number = 5number/2 返回2,因此modNumber 永远不会等于0。
  • 顺便说一句,您可能希望使用位掩码和移位运算符而不是 mod 和除法。会更快更干净。
  • 感谢您的回复,我从未听说过这些,所以我会看看。它们听起来像是与密码学有关?
  • 也谢谢邹邹

标签: java arrays exception bounds


【解决方案1】:

你永远不会在你的循环中改变number,并且你在循环中分配modNumber = number / 2,所以从第二次迭代开始modNumber是一个常数(对于第一次迭代的大部分时间它是2,但是你将number / 2 分配给它);如果你达到了那个点,你会留在那里。所以循环一直持续到counter 到达30,此时digits[counter] 抛出异常。

【讨论】:

  • 谢谢!当我意识到我完全错过了这一点时,你可以想象我内心的呻吟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2015-10-26
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多