抛出Java -NullPointerException,我不确定原因

时间:2016-03-15 21:57:17

标签: java arrays

我正在编写一个程序,其中有一个名为" equals"测试两个二维数组是否相等"对彼此。 equals返回两个args在这个意义上是否相等     如果两个args都为null,则返回true     如果一个arg为null而另一个不是,则返回false;     如果2个数组具有不同的行数,则返回false 否则,返回arr1中的每个元素是否等于arr2中的对应元素,因为两个元素都是null,或者两个元素都引用具有相同数量的int且具有相同顺序的相同值的数组。

等于方法定义:

public static boolean equals( int[][] arr1, int[][] arr2){
    //both are null references
    if(arr1 == null && arr2 == null)
        return true;
    //only one is a null reference
    if ((arr1 == null && arr2 != null) || (arr1 == null && arr2 != null))
        return false;

    //number of rows not identical
    if( arr1.length != arr2.length )
        return false;

    for(int i = 0 ; i < arr1.length; i++){ //checking row equivalence 
        if(arr1[i] == null && arr2[i]==null){ //both null
            continue;
        }
        if(arr1[i] == null || arr2[i] == null) //one is null
            return false;
        else if(arr1[i].length != arr2[i].length){
            return false;
        }
        else{
            for(int j = 0; j < arr1[i].length; i++){ //#of columns equal, compare them
                System.out.println(i + "," + j); //helps debug
                if(arr1[i][j] != arr2[i][j])
                    return false;
            }
        }
    }
    return true;

} //equals

当我打电话

equals( new int[][]{{1,2},{3,4},null}, new int[][]{{1,2},null,{3,4}} ) 

我的程序崩溃,抛出NullPointerException。

Eclipse说它在这一行失败了:

if(arr1[i][j] != arr2[i][j])

问题是,据我所知,我的程序不应该进入该行所在的封闭for循环。它应该在此时返回false:

if(arr1[i] == null || arr2[i] == null) //one is null
            return false;

我在这里做错了什么?谢谢。

1 个答案:

答案 0 :(得分:3)

你有缺陷,

if ((arr1 == null && arr2 != null) || (arr1 == null && arr2 != null))

应该是

if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))

因为否则您不会测试 arr1arr2然而,我更希望Arrays.deepEquals(Object[], Object[])如果两个指定的数组彼此非常相等,则返回true ...如果两个数组引用都为null,则认为两个数组引用非常相等,或者如果它们引用包含相同数量元素的数组,并且两个数组中所有相应的元素对都非常相等。 like

public static boolean equals(int[][] arr1, int[][] arr2) {
    return Arrays.deepEquals(arr1, arr2);
}