2016-03-15 4 views
-3

Я пишу программу, в которой у меня есть метод под названием «равно», чтобы проверить, являются ли два двумерных массива «равными» друг другу. equals возвращает, являются ли два аргумента эквивалентными в том смысле, что Если оба аргумента равны нулю, верните true Если один аргумент arg равен null, а другой - нет, верните false; Если 2 массива имеют другое количество строк, верните false else, верните, будет ли каждый элемент в arr1 эквивалентен соответствующему элементу в arr2 в том смысле, что оба элемента равны нулю, или оба элемента относятся к массивам с одинаковым числом от int с теми же значениями в том же порядке.Java -NullPointerException, и я не уверен, почему

составляет определение метода:

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

ИСПОЛЬЗУЙТЕ ДЕВАГГЕР. – redFIVE

ответ

3

У вас есть дефект здесь,

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

должен быть

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

, потому что в противном случае вы не испытывая как являются arr1 и arr2. Однако, я бы предпочел Arrays.deepEquals(Object[], Object[]), который возвращает true, если два заданных массива глубоко равны друг другу ... Две ссылки на массивы считаются глубоко равными, если оба они являются нулевыми или относятся к массивам, которые содержат одинаковое количество элементы и все соответствующие пары элементов в двух массивах глубоко равны.

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

Лучший ответ объяснил бы, что происходит, и почему это изменение необходимо сделать. Кроме того, он может расширяться с помощью другого более простого встроенного метода. – Tunaki

+0

Ах, не поймал это. Спасибо. Однако это не приводило к сбою моей программы, просто давая мне неправильный вывод для некоторых входов. Моя программа по-прежнему разбивается по описанной причине. – MV94

+0

@ MV94 Я бы предложил вам отлаживать ваш код шаг за шагом и определять, что такое 'null'. Тогда вы сможете это решить. – Tunaki

Смежные вопросы