【问题标题】:java.lang.ArrayIndexOutOfBounds Exceptionjava.lang.ArrayIndexOutOfBounds 异常
【发布时间】:2012-03-19 17:04:34
【问题描述】:

谁能帮我解决我正在做的作业问题?基本上我试图创建的程序要求用户输入一个整数N,然后为两组单独的 N 个整数,这些组存储在两个单独的数组(x 和 y)中,然后调用一个函数 mixReverse(a, b)xy 作为参数。 mixReverse(x,y) 函数将 y 数组中元素的顺序颠倒,然后将每个数组的元素交错成一个最终数组,这样finalArray 由 arr1[0]、arr2[arr2.length-1]、 arr1[1], arr2[arr2.length-2], ... arr1[arr1.length-1], arr2[0].

我试过这段代码,但它有问题:

finalArray[0] = arr1[0];
    finalArray[1] = arr1[0];
    for (int j=2; j<(2*arr1.length); j++) {
        if (j%2==0) {
            finalArray[j] = arr1[j/2];
        }

        else {
            finalArray[j] = arr2[(((j+1)*(2))-1)];
        }
    }

特别是这一行:finalArray[j] = arr1[j/2];

正在抛出错误:

java.lang.ArrayIndexOutOfBoundsException: 7
在 lab2part1.mixReverse(lab2part1.java:33)
在 lab2part1.main(lab2part1.java:15)

我知道错误是“抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。”但我无法弄清楚为什么索引是非法的。那么数组的长度是 2*(arr1.length),所以这个 for 循环应该可以正常工作。 J 永远不会是负数,也永远不会等于 arr1.length -1(等于 finalArray 的最终索引)。谁能帮助我找到解决方案?

【问题讨论】:

  • 上述失败的输入是什么?
  • finalArray 在哪里初始化?
  • "那么数组的长度是 2*(arr1.length)"。哪个数组的长度?您确定错误所在的行吗?你确定每个数组的长度吗?设置数组的代码在哪里?您是否尝试过使用调试器?您是否尝试过使用输出语句(System.out.println 或类似语句)来验证执行过程中的不同点是否与您认为的一样?你有没有尝试过任何东西?
  • 将 sn-p 更改为一个简短但 完整 的程序来演示该问题将非常有帮助...
  • 你能说明finalArray的定义吗?也许你不小心把它创建得太小了。

标签: java


【解决方案1】:

我会这样做(没有 %2 和 if 语句的难以理解的混乱)

int[] finalArray = new int[ 2 * N ];

for ( int i = 0; i < N; i++ ){

    finalArray[ 2 * i ] = array1[ i ];
    finalArray[ 2 * i + 1 ] = array2[ array2.length - i - 1 ];

}

【讨论】:

  • 谢谢,这样干净多了,没想到这么干。
【解决方案2】:

这一行:

finalArray[j] = arr2[(((j+1)*(2))-1)];

看起来很可疑。您正在使用项目 7、11、15 等。我认为这不是你想要的 arr2。

【讨论】:

    【解决方案3】:

    如果arr1和arr2的长度一样,那么这部分就是问题所在:

    arr2[(((j+1)*(2))-1)];
    

    但是scibuff已经写好了答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-11
      • 2021-12-05
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多