数组索引超出范围异常

时间:2014-11-26 13:19:51

标签: java arrays indexing

我想打印出这个多维数组的元素,但是我得到索引超出范围错误。

public class test {
    public static void main(String[] args) {
        int array1[][]={{1,2,3,4},{5},{6,7}};
        for (int i=0; i<3;i++){
            for (int j=0; j<4;j++){
                System.out.println(array1[i][j]);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:5)

问题在于,使用这样编写的循环,您假设嵌套数组的长度都是4(并且它们不是)。你最好这样做:

for (int i=0; i < array1.length;i++) {
    for (int j=0; j < array1[i].length;j++) {
        ...
    }
}

答案 1 :(得分:2)

是的,因为第二个“子阵列”没有4个元素。动态执行此操作会更好:

// Note preferred syntax for array types - keep all the type info in one place.
int[][] array1 = {{1,2,3,4},{5},{6,7}};
for (int i = 0; i < array1.length; i++) {
    for (int j = 0; array1[i].length; j++) {
        System.out.println(array1[i][j]);
    }
}

这样,内循环的迭代计数取决于迭代的数组。

另一种方法是使用增强型for循环:

for (int[] subarray : array1) {
    for (int value : subarray) {
        System.out.println(value);
    }
}

答案 2 :(得分:0)

关于以下解决方案有2分(以及其他类似的答案):

for (int i=0; i < array1.length;i++) {
    for (int j=0; j < array1[i].length;j++) {
        ...
    }
}
  • 在这里,因为代码很短,所以不会有太大的区别,但是为了获得更好的性能,如果结果永不更改,则应始终避免重复计算。 array1的长度不会改变,因此每次迭代计算其长度都没有效率。这将是改进的解决方案。

    int array1Length = array1.length;
    
    for (int i=0; i < array1Length;i++){
    
            int array1InnerLength = array1[i].length;
    
            for (int j=0; j < array1InnerLength;j++){
                    ...
            }
    }
    
  • 有些人可能建议使用++j / ++i而不是i++j++以获得更好的性能,您可以在此处阅读有关的更多信息:{{3 }}。它不是至关重要的imo,但它可以增进您对所编写代码的理解。