首页 文章

抛出Java -NullPointerException,我不确定为什么[关闭]

提问于
浏览
-3

我正在编写一个程序,其中,我有一个名为“equals”的方法来测试两个二维数组是否相互“相等” . equals返回两个args是否等效,如果两个args都为null,则返回true如果一个arg为null而另一个不是,则返回false;如果2个数组具有不同的行数,则返回false else,返回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 回答

  • 3

    你这里有缺点,

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

    应该

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

    因为否则你没有测试 botharr1arr2 . However ,我更喜欢Arrays.deepEquals(Object[], Object[]),如果两个指定的数组彼此深度相等则返回true ...如果两个数组引用都为null,或者它们引用包含相同数量元素的数组,则认为两个数组引用完全相等两个阵列中相应的元素对完全相同 . 喜欢

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

相关问题