2016-03-15 68 views
-3

我正在编写一个程序,其中,我有一个名为“equals”的方法来测试两个二维数组是否相互“相等”。如果两个参数都为空,则返回true 如果一个参数为空而另一个参数不为空,则返回false;否则返回false。 如果2个数组的行数不同,则返回false else,返回arr1中的每个元素是否与arr2中的对应元素相等,因为这两个元素都为null,或者这两个元素都指向具有相同数字的数组具有相同顺序的相同值的整数。抛出Java -NullPointerException异常,我不知道为什么

equals方法的定义:

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]) 

的问题是,据我所知,我的程序不应该进入封闭的环,其中该线位于开始用。它应该在这一点上返回false:

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

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

+3

投票结束为排印错误。 –

+0

使用DEBUGGER。 – redFIVE

回答

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); 
} 
+1

更好的答案可以解释发生了什么以及为什么需要做出这种改变。此外,它可以通过另一种更简单的内置方法进行扩展。 – Tunaki

+0

啊,没有抓住这个。谢谢。 但是,这并没有导致我的程序崩溃,只是给了我一些输入的错误输出。由于所描述的原因,我的程序仍然崩溃。 – MV94

+0

@ MV94我建议你通过你的代码逐步调试并确定什么是'null'。然后,你将能够解决它。 – Tunaki

相关问题