我正在编写一个程序来计算汉明码,我收到一个超出界限的数组异常。问题似乎与这种方法有关:
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;
}
答案 0 :(得分:0)
错误消息表示i = 5
失败,但您的循环以m
的值为条件,因此循环出错。
为i
的每次迭代打印m
和i = 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
。