如何java.lang.ArrayIndexOutOfBoundsException?

时间:2010-12-15 15:42:33

标签: java arrays

我试图多次修复问题,但我没有得到产生异常的问题,这是“--------------------配置: - ------------------ ë

xception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 56
    at testing.compressionPBox(testing.java:61)
    at testing.parityDrop(testing.java:39)
    at testing.roundKeyGenerator(testing.java:23)
    at testing.main(testing.java:14)"

只需我的程序创建一个64长度的数组,然后用1到64的值填充它然后使用方法roundKeyGenerator(roundArray);要执行该方法,当该方法执行时,它创建一个长度为56的数组,然后使用parityDrop方法从长度为64的初始数组返回长度为56的数组,但是如何创建和删除一些索引!!简单地说,我创建了一个预定义的表,当我通过索引从最初从0开始调用表方法时,该方法获取此索引并查看table_cell的值是什么[index] = value_X 然后将value_x返回给调用者metod并将vaule_X作为intailArray的索引,其大小为64并获取其值,然后将其存储在返回的数组中,具体取决于其指针停止的位置,我认为指针是问题,我认为第二个56长度的数组超过限制,然后产生异常。

   static int [] roundArray=new int [64];    
    public static void main(String [] arg) 
         { 
          for(int i=0;i<roundArray.length;i++)
           roundArray[i]=i+1;
          roundKeyGenerator(roundArray) ;      
         } 



     public static int [] roundKeyGenerator(int [] k) //takes an int array of length 64 repesents the key in binary representation
        {
         int [] key=new int [56];
         key=parityDrop(k); 
         return key;
        }
        public static int [] parityDrop(int [] key)//takes an int array of length 64 repesents the key and return the key in an arrayof length 56 
        {
         int index;
         int [] result=new int[56];
          for(int i=0;i<key.length;i++)
          { 
           index=compressionPBox(i);//return cell value from straightPBoxTable
           result [i]= key[index-1];
          }

         return result;

        }
        public static int compressionPBox(int i){

          int cell[] =new int [56];
          cell[0] =57 ;cell[1] =49 ;cell[2]=41  ;cell[3] =33 ;cell[4] =25 ;cell[5] =17 ;cell[6] =9 ;cell[7] =1;  
          cell[8] =58 ;cell[9] =50 ;cell[10]=42 ;cell[11]=34 ;cell[12]=26 ;cell[13]=18 ;cell[14]=10 ;cell[15]=2;
          cell[16]=59 ;cell[17]=51 ;cell[18]=43 ;cell[19]=35 ;cell[20]=27 ;cell[21]=19 ;cell[22]=11 ;cell[23]=3;
          cell[24]=60 ;cell[25]=52 ;cell[26]=44 ;cell[27]=36 ;cell[28]=63 ;cell[29]=55 ;cell[30]=47 ;cell[31]=39;
          cell[32]=31 ;cell[33]=23 ;cell[34]=15 ;cell[35]=7 ;cell[36]=62 ;cell[37]=54 ;cell[38]=46 ;cell[39]=38;
          cell[40]=30 ;cell[41]=22 ;cell[42]=14 ;cell[43]=6 ;cell[44]=61 ;cell[45]=53 ;cell[46]=45 ;cell[47]=37;
          cell[48]=29 ;cell[49]=21 ;cell[50]=13 ;cell[51]=5 ;cell[52]=28 ;cell[53]=20 ;cell[54]=12 ;cell[55]=4;
         return cell[i];
         }// predefined permutation rule

5 个答案:

答案 0 :(得分:4)

  for(int i=0;i<key.length;i++)
  { 
   index=compressionPBox(i);//return cell value from straightPBoxTable
   result [i]= key[index-1];
  }

您无法索引负数组。第一个循环上的index = 0。 key [-1]是一个错误。

答案 1 :(得分:2)

你的阵列有不同的大小 - 一个有56个,一个有64个。出现问题。

答案 2 :(得分:2)

package org.ferencszaszdi.sistemaNit;
public class SistemaNit {
     public static void main(String args[]) {
        String nit = "3894140-6";
    String valor[]={};        
    int num= nit.length();
        int num2 = num - 2;
        int numero = num;
        int in = 0;
        int va = 0;
        for(int inicio = 0;inicio<=num;inicio++) {
            valor[in] = nit.substring(in);
            in++;
    }
    int in2 = 0;
    for(int inicio2 = 0;inicio2<=num2;inicio2++) {
        int valor2 = Integer.parseInt(valor[in2]);
            int val = numero * valor2;
            va = va + val;
            numero--;
            in2++;
        }
        String residuo = nit.substring(num);
        int residuo2 = Integer.parseInt(residuo);
        int nume = va%11;
        if (nume == residuo2){
           System.out.println ("El nit es correcto");
        }
        else
        {
           System.out.println ("El nit es incorrecto");
         }
    }
}

答案 3 :(得分:1)

您的数组roundArray的长度为64,但在方法roundKeyGeneratorparityDropcompressionPBox内,您有长度为56的数组。

您正在使用parityDrop调用方法k,然后循环它。在parityDrop中,您使用变量compressionPBox调用i,该变量将介于0到63之间(key的长度)。但是在compressionPBox中,您正在返回cell[i],当i为&gt; = 56时,这将失败。

注意:要解决这样的问题,请仔细查看异常的堆栈跟踪。它会准确地告诉您错误发生在源文件的哪一行。转到源代码中的那个位置并追溯出错的地方。您还可以使用调试器逐步执行代码以了解发生的情况。 Eclipse和NetBeans等IDE都有非常好的内置调试器。

答案 4 :(得分:0)

您的错误在compressionPBox。以下是它如何实现:

  • main调用roundKeyGenerator传递roundArrayint[64]} k参数。
  • roundKeyGenerator调用parityDrop,为k参数传递key
  • parityDrop0(包括)循环到key.length(不包含),因此会从0 ... 63(包括)循环调用compressionPBox包含i参数的每个值。{/ 1>
  • compressionPBox使用i索引cellint[56]

...这就是为什么您的ArrayIndexOutOfBoundsException报告索引56上的错误。一旦i达到56,您就无法再使用该值索引cell。< / p>