数组索引超出范围的例外无缘无故

时间:2016-01-20 17:07:16

标签: java

我在prog的最后一行得到了数组索引超出范围的异常, output[1][1]在那里产生了这样的例外。但是在前一个循环中,同样的事情仍然正常。

{  
    int ict=66,total_slots=12,h1=15,index_count=65;
    String output[][] = new String[ict][total_slots+1];

    for (int x = 0; x < (ict); x++)
        output[x][0] = Integer.toString(x);
    for (int y = 0; y < (total_slots + 1); y++)
        output[0][y] = Integer.toString(y);
    for (int x = 1; x <= (index_count); x++ )
        for (int y = 1; y <= (total_slots); y++)
            output[x][y] = "n";

    for (int x=1; x <= h1; x++) {
        output[x][1]="y";//exception occurs here
        limit[x]++;
    }
}

3 个答案:

答案 0 :(得分:1)

请记住,当您声明类似String output[][]=new String[5][5];的数组时,output[4][4]是您可以访问的最后一个元素,因为数组索引从0开始

您已将数组声明为:

String output[][] = new String[ict][total_slots+1];

在你的for循环中

for( int x=1; x<=(ict); x++ )
    for( int y=1; y<=(total_slots); y++)
         output[x][y]="n";

在外部循环的最后一次迭代和内部循环的第一次迭代中,您正在尝试访问引发异常的output[ict][0]。请记住,由于0是第一个索引,ict - 1将是第一个维度的最后一个有效索引。

试试这个:

String output[][] = new String[ict][total_slots]; //this is cleaner

for( int x=0; x<ict; x++ )
    for( int y=0; y<total_slots; y++)
         output[x][y]="n";

这样,外部循环的最后一次迭代只会达到ict - 1

编辑: 看来你已经明显地编辑了这个问题。请不要在将来编辑您的问题以回答答案,因为这只会让新读者感到困惑。

由于您的代码现在正确,唯一的错误(编译时间不少,与异常无关)是limit[x]++;无效的事实,因为limit尚未在此范围内声明。否则代码是合法的,运行正常。

答案 1 :(得分:1)

    {  
        int ict=66,total_slots=12,h1=15,index_count=65;
..................................................
..................................................
        for (int x=1; x <= h1; x++) {
                output[x][1]="y";//exception occurs here
                limit[x]++;
            }
        }

在最后一个for循环中,你收到ArryIndexOutOfBoundsException,同时试图访问元素输出[13] [1]导致你的数组宽度只有13,即最大索引将是12但不超过

使用total_slots而不是h1

答案 2 :(得分:1)

  

我在prog的最后一行得到了数组索引超出范围的异常,输出[1] [1]在那里产生了这样的异常。

重新检查控制台输出。您必须弄错错误行,因为无法生成此类异常。问题最可能在于limit[],我们不知道它是如何宣布的。

顺便说一句,最后一行是limit[x]++;)