无法解决java.lang.ArrayIndexOutOfBoundsException

时间:2016-02-10 04:55:34

标签: java

我正在编写一个程序来计算汉明码,我收到一个超出界限的数组异常。问题似乎与这种方法有关:

static int[] computeParityBits(int[] inWord, int[] parityBits) {
for (int i=0, m=2; m < inWord.length; i++) {
    m = (int) Math.pow(m, i);
    parityBits[i] = processPower(m, inWord);
}
return parityBits;

当使用Math.pow函数时,整数m不会改变它的值。我尝试了不同的东西,但似乎无法让它正常工作。只要它们的值低于int[] inWord.length,该方法就应该通过2的所有幂。在此之后,它应该为方法parityBits[i]返回的值分配processPower()

收到的例外:

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:5       在hamming_code.HammingCoder.computeParityBits(HammingCoder.java:34)       在hamming_code.HammingCoder.computeHammingCode(HammingCoder.java:27)       在hamming_code.HammingCoder.main(HammingCoder.java:61)

代码的更大部分:

    static int[] computeHammingCode(int[] inWord, int codeLength) {
    int[] parityBits = new int[codeLength - inWord.length];
    parityBits = computeParityBits(inWord, parityBits);
    return parityBits;
}

static int[] computeParityBits(int[] inWord, int[] parityBits) {
    for (int i=0, m=2; m < inWord.length; i++) {
        m = (int) Math.pow(m, i);
        parityBits[i] = processPower(m, inWord);
    }
    return parityBits;
}

static int processPower(int m, int[] inWord) {
    int counter = 0;
    for (int i = 0; i < inWord.length; i++){
        for (int n = 0; n < m; n++) {
            counter = counter + inWord[i];
        }
        for (int k = 0; k < m; k++) {
            i++;
        }
    }
    if (counter % 2 == 0) {
        return 0;
    } else 
        return 1;
}

3 个答案:

答案 0 :(得分:0)

错误消息表示i = 5失败,但您的循环以m的值为条件,因此循环出错。

i的每次迭代打印mi = 5的值会显示错误:

for (int i=0, m=2; i <= 5; i++) {
    m = (int) Math.pow(m, i);
    System.out.println(i + ": " + m);
}

输出Ideone

0: 1
1: 1
2: 1
3: 1
4: 1
5: 1

如您所见,m始终为1

这是因为第一次迭代计算:

i=0,m=2: 2⁰ = 1
i=1,m=1: 1¹ = 1
i=2,m=1: 1² = 1
i=3,m=1: 1³ = 1
i=4,m=1: 1⁴ = 1
i=5,m=1: 1⁵ = 1

调试代码应该很容易向您展示,比在此处获得答案更快。

答案 1 :(得分:-1)

我没有看到任何东西阻止我超过codeLength - inWord.length。这将解释例外情况。

答案 2 :(得分:-1)

你得到错误,因为在第一次迭代时你有Math.pow(m, 0);并且它等于1.然后m总是1,因为1的幂总是1.所以i递增,但是m没有。但退出循环条件m < inWord.length