数组索引超出范围:30(Java)

数组索引超出范围:30(Java),java,arrays,exception,bounds,Java,Arrays,Exception,Bounds,我正在编写一个程序,将用户输入的整数打印成二进制形式。 当我运行它并输入数字5时,它崩溃并给出错误: java.lang.ArrayIndexOutOfBoundsException:30 在PrintBinaryDigitsFixed.main(PrintBinaryDigitsFixed.java:27) i、 e“数字[计数器]=数字%2 为什么我会遇到越界异常?它应该将余数分配给第一个元素,然后再转移到第二个元素,不是吗 我觉得我犯了一个明显的错误,但我不知道是什么 final int

我正在编写一个程序,将用户输入的整数打印成二进制形式。 当我运行它并输入数字5时,它崩溃并给出错误:
java.lang.ArrayIndexOutOfBoundsException:30 在PrintBinaryDigitsFixed.main(PrintBinaryDigitsFixed.java:27) i、 e“数字[计数器]=数字%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
,并且您在循环中分配
modNumber=number/2
,因此从第二次迭代开始
modNumber
是一个常量(对于第一次迭代的大多数情况,它是
2
,但随后您将
number/2
分配给它);如果你到达了那一点,你就会呆在那里。因此循环一直持续到
计数器
达到
30
,此时
数字[counter]
抛出异常。

您从不更改循环中的
number
,并且在循环中分配
modNumber=number/2
,因此从第二次迭代开始
modNumber
是一个常量(对于第一次迭代的大部分时间,它是
2
,但随后您将
number/2
分配给它);如果您到达该点,您将停留在那里。因此循环将继续,直到
counter
达到
30
,此时
位[计数器]
抛出异常。

如果
number=5
number/2
返回
2
,因此
modNumber
永远不等于0。顺便说一句,你可能需要使用位掩码和移位运算符,而不是mod和division。这会更快、更干净。谢谢你的回答,我从来没有听说过这些,所以我会看看。它们听起来像是与密码学有关吗?谢谢你ZouZou tooIf
number=5
number/2
返回
2
,因此
modNumber
永远不等于0。顺便说一句,你可能想使用位掩码和移位运算符,而不是mod和division。这会更快更干净。谢谢你的回答,我从来没有听说过我来看看。它们听起来像是密码学的东西?谢谢你邹祖的牙床!你可以想象当我意识到我完全错过了它时我内心的呻吟谢谢!你可以想象当我意识到我完全错过了它时我内心的呻吟